2008-10-15 39 views
11

Tôi đang làm việc trên các tập lệnh áp dụng các bản cập nhật lược đồ cơ sở dữ liệu. Tôi đã thiết lập tất cả các kịch bản cập nhật SQL của tôi bằng cách sử dụng giao dịch bắt đầu/cam kết. Tôi chuyển các script này tới psql trên dòng lệnh.Giao dịch lồng nhau trong postgresql 8.2?

Tôi hiện cần áp dụng nhiều tập lệnh cùng một lúc và trong một giao dịch. Cho đến nay giải pháp duy nhất tôi đưa ra là xóa giao dịch bắt đầu/cam kết khỏi tập lệnh gốc, sau đó kết hợp chúng lại với nhau bên trong một khối giao dịch bắt đầu/cam kết bắt đầu mới. Tôi đang viết kịch bản perl để làm điều này trên bay.

Hiệu quả tôi muốn các giao dịch lồng nhau, mà tôi không thể tìm ra cách thực hiện trong postgresql.

Có cách nào để thực hiện hoặc mô phỏng các giao dịch lồng nhau cho mục đích này không? Tôi có những thứ thiết lập để tự động bảo lãnh về bất kỳ lỗi nào, vì vậy tôi không cần phải tiếp tục trong giao dịch cấp cao nhất nếu bất kỳ giao dịch nào thấp hơn không thành công.

Trả lời

5

Bạn cũng có khả năng sử dụng các giao dịch lồng nhau bên trong postgresql bằng cách sử dụng SavePoints.

Hãy ví dụ mã này:

CREATE TABLE t1 (a integer PRIMARY KEY); 

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS 
$$BEGIN 
    INSERT INTO t1 (a) VALUES (1); 
    INSERT INTO t1 (a) VALUES (2); 
    INSERT INTO t1 (a) VALUES (1); 
    INSERT INTO t1 (a) VALUES (3); 
    RETURN TRUE; 
EXCEPTION 
    WHEN integrity_constraint_violation THEN 
     RAISE NOTICE 'Rollback to savepoint'; 
     RETURN FALSE; 
END;$$; 

BEGIN; 

SELECT test_exception(); 
NOTICE: Rollback to savepoint 
test_exception 
---------------- 
f 
(1 row) 

COMMIT; 

SELECT count(*) FROM t1; 
count 
------- 
    0 
(1 row) 

Có lẽ điều này sẽ giúp bạn ra ngoài một chút.

+0

Để sử dụng các điểm lưu trong trường hợp này, tôi phải sửa đổi các tập lệnh hiện tại của mình và cách chúng được chạy. Trong trường hợp cụ thể này, nếu tôi định làm điều đó, tôi sẽ chỉ xóa khối giao dịch bắt đầu/kết thúc khỏi tất cả các tập lệnh của tôi và thêm nó một cách riêng biệt, làm cho nó dễ dàng thực hiện nhiều thao tác cùng một lúc. Cảm ơn! –

0

Tôi đã kết thúc 'giải quyết' vấn đề của mình ngoài băng - tôi sử dụng tập lệnh perl để làm lại các tập lệnh đầu vào để loại bỏ lệnh gọi giao dịch/cam kết bắt đầu, sau đó đẩy tất cả vào một tệp, bắt đầu giao dịch/cam kết của riêng mình.

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