Bạn đang sử dụng một giao dịch có thể tuần tự hóa đang chờ một số giao dịch khác khóa cùng một bảng thành ROLLBACK
.
Nếu giao dịch khác này không khôi phục nhưng thay vào đó cam kết, bạn sẽ gặp phải lỗi này.
Tình huống có vẻ như sau:
-
Alice
mở phiên trình duyệt của cô ấy gọiDELETE FROM TABLE1 WHERE Version = 'v1'
-
Bob
mở phiên của anh ấy gọiDELETE FROM TABLE1 WHERE Version = 'v1'
sauAlice
đã làm điều đó nhưng trước khi cô ấy cam kết.
Bob
Giao dịch của sẽ đợi kể từ khiAlice
đã khóa các hàng bằngVersion = 'v1'
-
Alice
cam kết giao dịch của cô ấy -
Bob
Giao dịch của không thành công vớiCannot serialize access
-
Để giải quyết vấn đề này, hãy đặt TRANSACTION ISOLATION LEVEL
thành READ COMMITTED
:
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
Trong trường hợp này, Bob
Truy vấn của sẽ được phát hành lại sau Alice
cam kết những thay đổi của cô ấy, như thể Bob
Giao dịch của được bắt đầu sau Alice
một trong những đã được cam kết.
Cập nhật
Bạn có thể vui lòng đăng một dấu vết về kết nối của mình không?
Để thực hiện việc này, hãy phát hành lệnh này ngay sau khi kết nối:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
, sau đó tìm trong $ORACLE_HOME\admin\udump
cho một *.trc
mới tệp