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:
-
Alicemở phiên trình duyệt của cô ấy gọiDELETE FROM TABLE1 WHERE Version = 'v1'-
Bobmở 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.
BobGiao dịch của sẽ đợi kể từ khiAliceđã khóa các hàng bằngVersion = 'v1'-
Alicecam kết giao dịch của cô ấy -
BobGiao 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