Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách làm cho MERGE có thể nối tiếp hóa

Ngoại lệ bạn đang thấy là hệ quả trực tiếp của việc sử dụng tuần tự hóa nghiêm ngặt. Nếu bạn có nhiều giao dịch đang hoạt động đồng thời, mỗi giao dịch bắt đầu bằng THIẾT LẬP MỨC ĐỘ CẠNH TRANH GIAO DỊCH CÓ THỂ XÁC NHẬN ĐƯỢC, khi bất kỳ giao dịch nào trong số chúng cam kết với các giao dịch khác sẽ nhận được ORA-08177. Đó là cách tuần tự hóa nghiêm ngặt được thực thi - cơ sở dữ liệu ném một ORA-08177 trong bất kỳ phiên nào bắt đầu bằng ISOLATION LEVEL SERIALIZABLE nếu một giao dịch khác đi vào một bảng mà phiên có thể tuần tự hóa cần. Vì vậy, về cơ bản, nếu bạn thực sự cần tuần tự hóa nghiêm ngặt, bạn phải xử lý ORA-08177 một cách thông minh, như sau:

DECLARE
  bSerializable_trans_complete  BOOLEAN := FALSE;
  excpSerializable              EXCEPTION;
  PRAGMA EXCEPTION_INIT(excpSerializable, -08177);
BEGIN
  <<SERIALIZABLE_LOOP>>
  WHILE NOT bSerializable_trans_complete
  LOOP
    BEGIN
      SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

      MERGE ...; -- or whatever

      COMMIT;

      bSerializable_trans_complete := TRUE;  -- allow SERIALIZABLE_LOOP to exit
    EXCEPTION
      WHEN excpSerializable THEN
        ROLLBACK;
        CONTINUE SERIALIZABLE_LOOP;
    END;
  END LOOP;  -- SERIALIZABLE_LOOP
END;

Serialization không phải là phép thuật và nó không phải là "miễn phí" (trong đó "miễn phí" có nghĩa là "Tôi với tư cách là nhà phát triển không phải làm bất cứ điều gì để làm cho nó hoạt động bình thường"). Nó đòi hỏi phải lập kế hoạch nhiều hơn và làm việc từ phía nhà phát triển để nó hoạt động bình thường, chứ không phải ít hơn. Chia sẻ và tận hưởng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy cập phần tử thứ 2 trong cột varray

  2. Di chuyển Java 11 - createConnectionBuilder () từ PoolDataSourceImpl xung đột với createConnectionBuilder () từ javax.sql.DataSource

  3. Trạng thái SQL [99999]; mã lỗi [17004]; Loại cột không hợp lệ:1111 Với Spring SimpleJdbcCall

  4. Oracle JDBC:tên người dùng / mật khẩu không hợp lệ (hoặc-01017)

  5. Kết nối với cơ sở dữ liệu Oracle