Bagaimana Oracle Menangani Beberapa INSERT Serentak Terhadap Satu Tabel

8

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!

Dustin
sumber
6
tidak ada yang mengalahkan mencoba sendiri untuk melihat :-)
Jack mengatakan coba topanswers.xyz
Benar. Namun, saya tidak yakin cara membuat kueri yang akan selesai 5 menit dengan sengaja.
Dustin
3
masukkan banyak data? insert into foo(id) select level from dual connect by level<1000000(meningkatkan jumlah nol satu per satu sampai cukup lambat)
Jack mengatakan coba topanswers.xyz

Jawaban:

4

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

REW
sumber
2

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.

keajaiban173
sumber