Saya mencoba memahami Oracle 11g sedikit lebih dekat. Pertanyaan saya sederhana: bagaimana Oracle menangani dua sesi yang mencoba untuk memasukkan catatan ke dalam satu tabel sekaligus.
Misalnya, INSERT A beroperasi pada pukul 1:00 siang melawan Tabel 1. Diperlukan waktu 5 menit untuk menyelesaikannya. INSERT B dijalankan pada pukul 1:02 siang melawan Tabel 1. Diperlukan waktu 1 menit untuk menyelesaikannya.
Apa yang akan terjadi? Apakah Oracle akan mengantri INSERT B akan dieksekusi setelah INSERT A selesai? Akankah INSERT B berjalan secara bersamaan dengan INSERT A?
Terima kasih!
insert into foo(id) select level from dual connect by level<1000000
(meningkatkan jumlah nol satu per satu sampai cukup lambat)Jawaban:
Sisipan tidak saling memengaruhi kecuali mereka akan mengalami konflik dengan batasan kunci primer atau unik. Mereka harus mandiri. Saya percaya masalah konkurensi ini adalah salah satu alasan mengapa urutan Oracle adalah objek yang terpisah (cache, generasi PK pengganti dipisahkan dari insert).
Dalam hal itu, mereka beroperasi pada tabel yang tidak dikomit seperti yang terlihat pada sesi mereka. Perilaku ini dijelaskan dalam posting stackoverflow di bawah ini.
/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle
sumber
Mungkin berguna untuk melihat Manajemen Transaksi Oracle (Konsep) atau Pemrosesan SQL untuk Pengembang Aplikasi (Panduan Pengembang Aplikasi Lanjutan)
Anda dapat menyelidiki perilaku oracle dengan membuka sesi dengan sqlplus, mengatur autocommit dengan mengeksekusi
nonaktifkan komitmen otomatis
dan mengeksekusi insert
masukkan ke nilai tableA (...) (...);
Biarkan sesi ini terbuka dan mulailah sesi sqlplus dari jendela lain, setel autocommit ke tidak aktif dan berikan sisipan lain. Kedua transaksi akan aktif sampai Anda menutupnya dengan komit (atau kembalikan).
Dalam kebanyakan situasi, tidak benar-benar perlu untuk menonaktifkan autocommit karena ini adalah default untuk sqlplkus jika Anda belum mengubahnya.
sumber