Не може да работи така. Помислете за:
- програма първа, отваряте транзакция и вмъквате в таблица FOO, която има първичен ключ autoinc (произволно, казваме, че получава 557 за стойността на ключа).
- Програма две стартира, тя отваря транзакция и вмъква в таблица FOO, получавайки 558.
- Програмирайте две вмъквания в таблица BAR, която има колона, която е външен ключ към FOO. Така че сега 558 се намира както във FOO, така и в BAR.
- Втора програма вече се ангажира.
- Трета програма стартира и генерира отчет от таблица FOO. Записът 558 е отпечатан.
- След това първата програма се връща назад.
Как базата данни възстановява стойността 557? Влиза ли във FOO и намалява ли всички други първични ключове, по-големи от 557? Как оправя BAR? Как изтрива 558, отпечатан в програмата за отчет три изхода?
Поредните номера на Oracle също са независими от транзакциите по същата причина.
Ако можете да разрешите този проблем за постоянно време, сигурен съм, че можете да спечелите много пари в полето на базата данни.
Сега, ако имате изискване вашето поле за автоматично увеличение никога да няма пропуски (за целите на одита, да речем). Тогава не можете да отмените транзакциите си. Вместо това трябва да имате флаг за състояние във вашите записи. При първото вмъкване състоянието на записа е "Незавършен", след което започвате транзакцията, вършите работата си и актуализирате състоянието на "състезавайте се" (или каквото ви трябва). След това, когато се ангажирате, записът е на живо. Ако транзакцията се върне назад, непълният запис все още е там за одит. Това ще ви причини много други главоболия, но е един от начините да се справите с одитните пътеки.