Theo mặc định, hành vi mà bạn đã mô tả là không thể xảy ra - các thay đổi được thực hiện trong một giao dịch đã cam kết sẽ có sẵn ngay lập tức cho tất cả các phiên. Tuy nhiên, vẫn có những trường hợp ngoại lệ:
-
Bạn có đang sử dụng bất kỳ tùy chọn WRITE nào trong lệnh COMMIT không? Nếu bạn không, hãy xác nhận giá trị của thông số khởi tạo COMMIT_WRITE của bạn. Nếu một trong hai người đang sử dụng "WRITE BATCH" hoặc đặc biệt là "WRITE BATCH NOWAIT", bạn có thể đang phải đối mặt với các vấn đề đồng thời. "WRITE BATCH NOWAIT" thường sẽ được sử dụng trong các trường hợp tốc độ ghi giao dịch của bạn có tầm quan trọng lớn hơn các vấn đề đồng thời có thể xảy ra. Nếu thông số khởi tạo của bạn đang sử dụng các biến thể "WRITE", bạn có thể ghi đè nó trên cơ sở giao dịch bằng cách chỉ định điều khoản NGAY LẬP TỨC trong cam kết của bạn (xem COMMIT)
-
Có phải giao dịch đang cố gắng đọc dữ liệu gọi SET TRANSACTION trước khi thực hiện giao dịch khác không? Việc sử dụng SET GIAO DỊCH để chỉ định CHỈ ĐỌC MỨC ĐỘ CÀI ĐẶT hoặc CÓ THỂ DÙNG THỬ sẽ dẫn đến giao dịch không có thay đổi nào xảy ra từ các phiên đã cam kết khác xảy ra sau khi yêu cầu SET GIAO DỊCH (xem ĐẶT GIAO DỊCH)
chỉnh sửa:Tôi thấy rằng bạn đang sử dụng lớp DataSource. Tôi không quen thuộc với lớp này - Tôi cho rằng đó là tài nguyên chia sẻ kết nối. Tôi nhận thấy rằng thiết kế ứng dụng hiện tại của bạn có thể không giúp bạn dễ dàng sử dụng cùng một đối tượng kết nối trong suốt quy trình làm việc của mình (các bước có thể được thiết kế để hoạt động độc lập và bạn đã không xây dựng trong một cơ sở để chuyển đối tượng kết nối từ bước này sang bước tiếp theo), nhưng bạn nên xác minh rằng các đối tượng kết nối được trả về đối tượng DataSource là "sạch", đặc biệt là đối với các giao dịch mở. Có thể bạn đang không gọi SET TRANSACTION trong mã của mình, nhưng một người tiêu dùng DataSource khác ở nơi khác có thể đang làm như vậy và đưa kết nối trở lại nguồn dữ liệu với phiên vẫn ở chế độ SERIALIZABLE hoặc READ ONLY. Khi chia sẻ kết nối, tất cả các kết nối bắt buộc phải được khôi phục trước khi chuyển giao chúng cho người tiêu dùng mới.
Nếu bạn không có quyền kiểm soát hoặc khả năng hiển thị đối với hành vi của lớp DataSource, bạn có thể muốn thử thực hiện ROLLBACK trên kết nối mới có được để đảm bảo rằng nó không có giao dịch kéo dài nào đã được thiết lập.