2009-12-22 23 views
5

Trong ứng dụng của chúng tôi, có bản cập nhật cơ sở dữ liệu chỉ được thực hiện sau khi cập nhật hậu quả đang được thực thi (cả hai đều sử dụng cùng một giao dịch). Tuy nhiên, chúng tôi đã phát hiện ra một luồng hiếm khi người dùng thoát khỏi ứng dụng trước lần cập nhật thứ hai, khiến cho người dùng đầu tiên bị loại bỏ. Tôi đang tìm cách để nhận ra bản cập nhật không được cam kết này khi thoát.Xác định xem giao dịch có cập nhật không được cam kết

Tôi biết các vấn đề như cuộc gọi này để thiết kế lại, nhưng điều đó là không thể. Do sự hiếm có của dòng chảy và cấu trúc của ứng dụng, tôi tự hỏi liệu có cách nào chỉ kiểm tra giao dịch cho bản cập nhật không được cam kết không.

Câu hỏi có giá trị đối với Oracle và SQLServer. Các ứng dụng được viết bằng PowerBuilder, nhưng nó có thể được mở rộng theo nhiều cách khác nhau (.NET, Win32, vv) nếu có vấn đề.

Trả lời

5

Trong Oracle, bạn có thể gọi DBMS_TRANSACTION.local_transaction_id. Điều này sẽ trả về mã định danh duy nhất của giao dịch hiện tại hoặc NULL nếu không có giao dịch nào đang hoạt động.

Chia sẻ và thưởng thức.

4

này có thể hữu ích

@@TRANCOUNT (Transact-SQL)

Trả về số giao dịch tích cực cho kết nối hiện hành.

+0

Tôi nghĩ đó chỉ là SQL Server? –

0

Để tạo điều kiện khắc phục sự cố cho kịch bản của bạn, bạn có thể xem xét việc sử dụng các giao dịch cục bộ rõ ràng cùng với việc sử dụng tùy chọn “WITH MARK”. Điều này cho phép bạn ghi lại tên của một giao dịch rõ ràng vào nhật ký giao dịch, tất nhiên bạn có thể kiểm tra ở giai đoạn sau để xác định chuỗi các sự kiện đã xảy ra.

Xem SQL Server Books Online: Marked Transactions

1

Trong Oracle có một cái nhìn V$TRANSACTION mà chứa một hàng cho mỗi giao dịch không bị giam. Không có cơ chế để xem bản chất của giao dịch đó từ bên ngoài (trừ khi bạn có công cụ được tích hợp vào mã của mình, ví dụ: bằng cách sử dụng DBMS_APPLICATION_INFO.SET_MODULE()). Tuy nhiên, phiên hiện tại có thể xem liệu nó có hoạt động không được cam kết như thế này không:

SQL> select t.status 
    2 from v$transaction t 
    3   join v$session s 
    4   on s.saddr = t.ses_addr 
    5 where s.sid = sys_context('userenv', 'sid') 
    6/

STATUS 
---------------- 
ACTIVE 

SQL> 

Nếu không có giao dịch không cam kết thì truy vấn này sẽ trả về NO_DATA_FOUND. Theo mặc định, lượt xem V $ không được cấp cho người dùng vì chúng thực sự là một DBA. Tuy nhiên, người dùng có đặc quyền thích hợp có thể biến truy vấn này thành chế độ xem và cấp quyền truy cập vào các joes thông thường.

Vì bạn quan tâm, bạn sẽ muốn làm gì? Giả sử đơn vị công việc được xác định chính xác quảng cáo hai bản cập nhật, chắc chắn nó sẽ là sai lầm để cam kết chỉ là một. Nếu tất cả các bạn muốn biết là chấm dứt bất thường này xảy ra sau đó một số hình thức theo dõi hoặc khai thác gỗ là những gì bạn cần.

chỉnh sửa

Bob Jarvis proposes sử dụng DBMS_TRANSACTION.LOCAL_TRANSACTION_ID(). Đó là một gợi ý tốt hơn là một cái nhìn thủ công. Khung nhìn V $ TRANSACTION cũng có thể được sử dụng để giám sát các giao dịch không được cam kết từ các phiên khác.

+0

Vâng, hai bản cập nhật không thực sự là một đơn vị công việc. Bản cập nhật không được cam kết thực sự là một cuộc gọi được định tuyến lại đến một máy chủ bên ngoài, thay vì được truyền đi được lưu trữ tại DB. Ứng dụng của chúng tôi có hành vi nhất quán liên quan đến cam kết, nhưng bản cập nhật đến từ một phần khác của ứng dụng. Một giao dịch riêng biệt có thể thích hợp, nhưng điều đó cũng sẽ có rất nhiều công việc. Vì vậy, nó sẽ là ok để cam kết một bản Cập Nhật không được cam kết. – eran

0

Trong SQL Server, chạy này:

IF @@TRANCOUNT>0 BEGIN 
    ROLLBACK; 
END; 
2

Nếu bạn đang ở trên PB11.5 và sử dụng một đối tượng giao dịch tùy chỉnh, nó khá dễ dàng để làm điều gì đó mà không phải là DBMS phụ thuộc. Trong sự kiện SQLPreview của đối tượng giao dịch, chỉ cần chuyển đổi một boolean khi một INSERT, UPDATE hoặc DELETE đi theo, sau đó tắt nó đi khi một COMMIT hoặc ROLLBACK đi qua.

Thực ra, không khó để trao đổi trong đối tượng giao dịch tùy chỉnh nếu bạn đang sử dụng SQLCA: Ứng dụng, Thuộc tính, Thuộc tính bổ sung, Các loại biến, SQLCA. Nếu bạn đang sử dụng nhiều kết nối cơ sở dữ liệu riêng biệt với rất nhiều câu lệnh "TẠO giao dịch" (tìm kiếm PB chuẩn có thể tìm thấy điều này hoặc PBL Peeper có thể giúp bạn tìm ra điều này với số khoảng trống giữa các từ), thì việc thực hiện điều này sẽ khó hơn, nhưng không phải là không thể.

Và, vì mục đích hoàn chỉnh, để tạo đối tượng giao dịch tùy chỉnh, đối tượng File/New/PB/Standard Class/Transaction. Bạn có một đối tượng người dùng thông thường, nơi bạn có thể định nghĩa các biến thể hiện (như boolean tôi đã đề xuất) và các sự kiện kịch bản (như sự kiện SQLPreview mà tôi đã đề xuất) và các hàm (bạn có thể muốn tạo một giao diện cho chức năng này ẩn các chi tiết trong trường hợp bạn muốn mở rộng nó trong tương lai). Lưu ý rằng SQLPreview không có sẵn trên đối tượng Transaction trước 11.5. (Đối với những người mà nghĩ rằng nó có vẻ quen thuộc trước 11.5, các DataWindow thực hiện một SQLPreview.)

Chúc may mắn,

Terry.

+0

Điều đó rất hữu ích. Cảm ơn, Terry! – eran

+0

Tôi không nhận được COMMIT hoặc ROLLBACK trong bản xem trước SQL của giao dịch. PB 12.5, kết nối ODBC. Điều này thực sự bums tôi bởi vì tôi đã thực hiện một cửa sổ giống như SQL Spy tiện lợi cho thấy tất cả các SQL đi đến cơ sở dữ liệu, và biến một thanh chỉ số lớn màu đỏ nếu có một giao dịch không cam kết. –

Các vấn đề liên quan