簡體   English   中英

ZF2 中的 Zend\\Db 如何控制事務?

[英]How does Zend\Db in ZF2 control transactions?

ZF1 Zend_Db 參考手冊有一整節是關於執行事務的。

ZF2 Zend\\Db 參考手冊缺少任何關於事務的文檔。

如何在 ZF2 中執行事務? 示例代碼會有所幫助。

你已經知道了。 開始、提交和回滾事務的正確方法如下:

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

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

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

只是為了把它放在那里,你還可以通過以下方式獲得最后一個 ID:

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

如果您使用 pgSQL,則需要添加序列以返回創建的最后一個 ID:

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

丟失的文檔很奇怪。

為了找出發生了什么,我不得不深入研究 Zend\\Db\\Adapter 的API 文檔

看起來beginTransactionrollbackcommit是在Zend\\Db\\Adapter\\Driver\\ConnectionInterface 中定義的 這意味着它們是可在每個單獨的適配器連接上調用的方法。 不幸的是,連接本身被埋沒了。

我不清楚——目前無法提供一個例子——是弄清楚你實際上在哪個對象上調用了這些方法。 在最壞的情況下,看起來您可能想要調用$adapter->getDriver()->getConnection()->beginTransaction()

呃。

我希望有更多知識的其他人以及手邊的 ZF2 副本會看到這一點並提供更好的選擇。

不要忘記,您可以自己發出BEGIN TRANSACTION / ROLLBACK / COMMIT / SET autocommit=... SQL 語句。 可能沒問題,因為它看起來不像 Zend\\Db 跟蹤事務狀態。

做交易有兩件事。
1 - MyISAM 不是事務引擎,因此將表引擎更改為 InnoDB。
2 - 事務查詢( "START TRANSACTION;" OR "ROLLBACK;" )連接必須與其他查詢(插入或更新)相同。
要在 ZF2 中執行此操作,您應該獲取當前的 db 適配器並在所有查詢中使用它。

此代碼將無法正常工作

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

由於$this->getAdapter()->getDriver()->getConnection()創建了新的數據庫連接。

請改用以下代碼:

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

要檢查您的連接是否正確,只需在 mysql 中啟用查詢日志。
運行查詢后,您將在 mysql 日志中的每個查詢之前看到連接號。所有事務查詢中的這些必須相同。

我在控制器中使用了beginTransactionrollbackcommit

我在不同模型上執行了許多事務,其中我使用預定義的函數而沒有任何控制事務(單個 DB 事務不需要)。

使用$this->getAdapter()->getDriver()->getConnection()->beginTransaction();
undefined getAdapter()方法上給出錯誤。

所以我執行以下方式,

  //begain tarnsaction
                $db = Zend_Db_Table_Abstract::getDefaultAdapter();

                $db->beginTransaction();

//rollback

                $db->rollback();

//commit db changes

                $db->commit();

希望對解決問題有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM