2013-06-13 29 views
5

Tôi gặp khó khăn khi thực hiện các giao dịch thủ công để làm việc như được ghi trong DBD :: Pg, hoặc tôi chỉ đơn giản là hiểu nhầm tài liệu.Quản lý giao dịch thủ công trong DBD :: Pg

Hiểu biết của tôi là nếu tôi muốn quản lý giao dịch theo cách thủ công, tôi nên tắt Tự động cộng tác.

$dbh->{AutoCommit} = 0; 
$dbh->begin_work; 

Nhưng khi tôi làm điều này, tôi nhận được lỗi liên tục

DBD::Pg::db begin_work failed: Already in a transaction 

Để có được điều này để làm việc, tôi cần phải bật Autocommit đầu tiên.

$dbh->{AutoCommit} = 1; 
$dbh->begin_work; 

Nhưng điều đó dường như không đồng ý với bất kỳ tài liệu nào.

Tôi chỉ đơn giản là hiểu nhầm nó?

+0

Điều đó có vẻ hơi lạ. Bạn có thể hiển thị một trường hợp thử nghiệm hoàn chỉnh và cung cấp cho các phiên bản DBI và DBD :: Pg của bạn? –

Trả lời

1

Hiểu biết của tôi là nếu tôi muốn quản lý giao dịch theo cách thủ công, tôi nên tắt Tự động cộng tác.

Không, hoàn toàn ngược lại. Đặt AutoCommit thành 0 bắt đầu giao dịch, vì vậy, bạn muốn đặt giao dịch thành 1. Để tự động thay đổi các thay đổi của bạn là phải có cơ sở dữ liệu không sử dụng các giao dịch, đó chính xác là những gì bạn muốn.

+0

Dường như không trực quan. Bật tự động, vì vậy tôi có thể bắt đầu giao dịch thủ công. –

+0

Tất nhiên, bởi vì bạn đang làm điều gì đó ngớ ngẩn. – ikegami

+2

Để công bằng, nó chỉ có ý nghĩa khi bạn nhận ra autocommit = 0 gửi một BEGIN cho bạn –

2

Hiểu biết của tôi là nếu tôi muốn quản lý giao dịch theo cách thủ công, tôi nên tắt Tự động cộng tác.

Đúng.

Tuy nhiên, DBD :: Pg tự động bắt đầu giao dịch của bạn cho bạn. Bạn không thể bắt đầu giao dịch theo cách thủ công. Lựa chọn tốt nhất của bạn là để tự động tắt và sau đó chỉ cần thực hiện:

$dbh->commit; 

khi bạn sẵn sàng cam kết. Điều này sẽ cả hai cam kết giao dịch hiện tại và bắt đầu một giao dịch mới.

Bây giờ, nếu bạn đặt tự động bật, thì mọi thứ tồn tại bên ngoài giao dịch sẽ trở thành giao dịch của chính nó, một giao dịch cho mỗi câu lệnh . Nếu bạn muốn được đảm bảo quản lý giao dịch theo cách thủ công, bạn muốn tắt nó.

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