mysql事務可以一次回滾多個庫里的多張表么


這次不按照以前的風格寫了

 

大背景就是,我寫了一段大邏輯,會依次往產品庫的產品表里添加數據記錄,往訂單庫的待付費訂單表添加待付費記錄,往協議庫的協議表添加協議簽署記錄

然后每一步都可能失敗,我期望只要有其中一個失敗,就把所有的都回滾掉。


 

尷尬的是,我在php的Zend代碼邏輯里,只回滾了一張表,這就尷尬了,難道mysql的事務只能在同一個數據庫中操作么?

 

其實不然,特意在mysql的客戶端中嘗試了下:

先查詢,在兩個庫中的兩張表中如下兩條記錄,

  

然后我開啟了事務:

 

 之后執行了對上面兩條記錄的刪除操作,之后就行回滾

 

再次查詢,發現上面的兩條記錄都回來了,也就是說,mysql事務的回滾是支持跨庫跨表的。

 


 

那我的代碼里寫的事務咋就不行了呢?

 

原來是以為代碼進行db連接是通過pdo實現的,然后在Zend里面對pdo進行了封裝,每一個pdo對象是一個 host + port + database;

 

實際上,我們在客戶端執行的時候,連接對象就是host + port ,而且pdo本身也支持host + port ,不知什么原因,zend里就偏偏封裝的時候加了database, 這樣只要涉及到跨庫,就沒法回滾了。

這樣還引入了一個壞處,就是如果我們有大量的db操作,這些操作會訪問同一個集群的不同的庫,則會多出非常多的連接了,這也就是之前我們頻繁報mysql連接數超了的原因了,

在沒法修改底層Zend pdo連接建立的情況下,就只能多增加mysql 的 proxy,多一個host + port


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM