2012-12-12 16 views

Trả lời

21

Tài liệu bị thiếu là tò mò.

Để tìm hiểu điều gì đã xảy ra, tôi phải đi sâu vào API docs cho Bộ điều hợp Zend \ Db \.

Có vẻ như beginTransaction, rollbackcommit được xác định trong Zend\Db\Adapter\Driver\ConnectionInterface. Điều này có nghĩa rằng chúng là các phương thức có thể gọi trên mọi kết nối bộ điều hợp. Thật không may là kết nối chính nó là khá chôn cất.

Điều tôi không rõ ràng - và không thể cung cấp ví dụ cho thời điểm này - đang tìm ra đối tượng nào bạn thực sự gọi các phương thức này. Trong trường hợp xấu nhất, có vẻ như bạn có thể muốn gọi $adapter->getDriver()->getConnection()->beginTransaction().

Eww.

Tôi hy vọng người khác có nhiều kiến ​​thức hơn và bản sao ZF2 tiện dụng sẽ thấy điều này và cung cấp tùy chọn tốt hơn.

Đừng quên rằng bạn chỉ có thể tự mình phát hành BEGIN TRANSACTION/ROLLBACK/COMMIT/SET autocommit=... câu lệnh SQL. Đây là có thể là OK, vì nó không giống như Zend \ Db theo dõi trạng thái giao dịch.

+0

Rất cám ơn Charles - Tôi sẽ cần đọc và đọc cẩn thận qua API, về điểm cuối cùng của bạn để phát hành trực tiếp tôi sẽ làm việc thông qua PDO để thực hiện việc này. –

35

Bạn đã hiểu. Cách thích hợp để Begin, Cam, và Rollback giao dịch như sau:

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); 

$this->getAdapter()->getDriver()->getConnection()->commit(); 

$this->getAdapter()->getDriver()->getConnection()->rollback(); 

Chỉ cần đặt này ra có quá bạn cũng có thể có được ID cuối tạo ra bởi:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue() 

Nếu bạn đang sử dụng pgSQL bạn sẽ cần phải thêm chuỗi để trả lại ID cuối cùng được tạo:

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq') 
+2

Cảm ơn @Diemuzi - điều này thực sự hữu ích. –

+0

Điều tuyệt vời này, được giải thích rất nhiều, cảm ơn !! Các tài liệu của ZF2 và ZF3 không rõ ràng về phần này! – evilReiko

8

Có hai vấn đề để thực hiện giao dịch.
1 - MyISAM không phải là công cụ giao dịch, do đó hãy thay đổi công cụ bảng thành InnoDB.
2 - Truy vấn giao dịch ("START TRANSACTION;" HOẶC "ROLLBACK;") kết nối phải giống với các truy vấn khác (Chèn hoặc Cập nhật).
Để thực hiện điều này trong ZF2, bạn sẽ nhận được bộ chuyển đổi db hiện tại và sử dụng nó trong tất cả các truy vấn.

Mã này sẽ không làm việc một cách chính xác:

$this->getAdapter()->getDriver()->getConnection()->beginTransaction(); 
    //do some jobs - e.g : multiple tables update or insert. 
    $this->getAdapter()->getDriver()->getConnection()->rollback(); 

Kể từ $this->getAdapter()->getDriver()->getConnection() Tạo kết nối db mới.

Sử dụng đoạn mã sau thay vì:

$connection = $this->getAdapter()->getDriver()->getConnection(); 
    $connection->beginTransaction(); 
    //do some jobs - e.g : multiple tables update or insert. 
    $connection->rollback(); 

Đối với kiểm tra nếu kết nối của bạn là đúng, chỉ cần kích hoạt tính năng đăng nhập truy vấn trong mysql.
Sau khi chạy truy vấn, bạn sẽ thấy số kết nối trước mỗi truy vấn trong nhật ký mysql.Điều này phải giống nhau trong tất cả truy vấn giao dịch.