Anda menggunakan transaksi serial yang menunggu beberapa transaksi lain mengunci tabel yang sama ke ROLLBACK
.
Jika transaksi lain ini tidak melakukan rollback tetapi melakukan, Anda akan mendapatkan kesalahan ini.
Skenarionya seperti berikut:
-
Alice
membuka sesi browsernya yang memanggilDELETE FROM TABLE1 WHERE Version = 'v1'
Bob
membuka sesinya yang memanggilDELETE FROM TABLE1 WHERE Version = 'v1'
setelahAlice
melakukannya tetapi sebelum dia berkomitmen.
Bob
transaksi menunggu sejakAlice
mengunci baris denganVersion = 'v1'
-
Alice
melakukan transaksinya -
Bob
transaksi gagal denganCannot serialize access
Untuk mengatasinya, setel TRANSACTION ISOLATION LEVEL
untuk READ COMMITTED
:
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
Dalam hal ini, Bob
kueri akan diterbitkan kembali setelah Alice
melakukan perubahannya, seolah-olah Bob
transaksi dimulai setelah Alice
salah satunya dilakukan.
Perbarui
Bisakah Anda memposting jejak koneksi Anda?
Untuk melakukannya, jalankan perintah ini segera setelah menghubungkan:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
, lalu cari di $ORACLE_HOME\admin\udump
untuk *.trc
fresh yang baru berkas