這次不按照以前的風格寫了
大背景就是,我寫了一段大邏輯,會依次往產品庫的產品表里添加數據記錄,往訂單庫的待付費訂單表添加待付費記錄,往協議庫的協議表添加協議簽署記錄
然后每一步都可能失敗,我期望只要有其中一個失敗,就把所有的都回滾掉。
尷尬的是,我在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
