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:
-
Alicemembuka sesi browsernya yang memanggilDELETE FROM TABLE1 WHERE Version = 'v1'Bobmembuka sesinya yang memanggilDELETE FROM TABLE1 WHERE Version = 'v1'setelahAlicemelakukannya tetapi sebelum dia berkomitmen.
Bobtransaksi menunggu sejakAlicemengunci baris denganVersion = 'v1'-
Alicemelakukan transaksinya -
Bobtransaksi 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