Itu tidak bisa bekerja seperti itu. Pertimbangkan:
- program satu, Anda membuka transaksi dan memasukkan ke dalam tabel FOO yang memiliki kunci utama autoinc (secara sewenang-wenang, kami mengatakan itu mendapat 557 untuk nilai kuncinya).
- Program dua dimulai, membuka transaksi dan memasukkan ke dalam tabel FOO mendapatkan 558.
- Program dua sisipan ke dalam tabel BAR yang memiliki kolom yang merupakan kunci asing untuk FOO. Jadi sekarang 558 terletak di FOO dan BAR.
- Program dua sekarang dijalankan.
- Program tiga dimulai dan menghasilkan laporan dari tabel FOO. Catatan 558 dicetak.
- Setelah itu, program satu akan diputar kembali.
Bagaimana database mendapatkan kembali nilai 557? Apakah itu masuk ke FOO dan mengurangi semua kunci utama lainnya yang lebih besar dari 557? Bagaimana cara memperbaiki BAR? Bagaimana cara menghapus 558 yang tercetak pada program laporan tiga keluaran?
Nomor urut Oracle juga tidak bergantung pada transaksi karena alasan yang sama.
Jika Anda dapat memecahkan masalah ini dalam waktu yang konstan, saya yakin Anda dapat menghasilkan banyak uang di bidang basis data.
Sekarang, jika Anda memiliki persyaratan bahwa bidang kenaikan otomatis Anda tidak pernah memiliki celah (untuk tujuan audit, katakanlah). Maka Anda tidak dapat mengembalikan transaksi Anda. Alih-alih, Anda harus memiliki bendera status di catatan Anda. Pada insert pertama, status record adalah "Incomplete" kemudian Anda memulai transaksi, melakukan pekerjaan Anda dan memperbarui status menjadi "compete" (atau apa pun yang Anda butuhkan). Kemudian ketika Anda melakukan, catatan itu hidup. Jika transaksi dibatalkan, catatan yang tidak lengkap masih ada untuk diaudit. Ini akan menyebabkan Anda banyak sakit kepala lainnya tetapi merupakan salah satu cara untuk menangani jejak audit.