生活随笔
收集整理的這篇文章主要介紹了
Mysql跨数据库事务
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
跨庫事務問題
在一個mysql實例中,現有A庫和B庫,在一個事務里同時向兩庫各表插入一條數據,這時就涉及一個事務跨不同庫的問題
1、首先要確保mysql開啟XA事務支持
SHOW VARIABLES LIKE ‘%XA%’
2.如果innodb_support_xa的值是ON就說明mysql已經開啟對XA事務的支持了。
如果不是就執行:
SET innodb_support_xa = ON
<?PHP
$dbtest1 = new mysqli("172.20.101.17","public","public","dbtest1")or die("dbtest1 連接失敗");
$dbtest2 = new mysqli("172.20.101.18","public","public","dbtest2")or die("dbtest2 連接失敗");//為XA事務指定一個id,xid 必須是一個唯一值。
$xid = uniqid("");//兩個庫指定同一個事務id,表明這兩個庫的操作處于同一事務中
$dbtest1->query("XA START '$xid'");//準備事務1
$dbtest2->query("XA START '$xid'");//準備事務2try {//$dbtest1$return = $dbtest1->query("UPDATE member SET name='唐大麥' WHERE id=1") ;if($return == false) {throw new Exception("庫dbtest1@172.20.101.17執行update member操作失敗!");}//$dbtest2$return = $dbtest2->query("UPDATE memberpoints SET point=point+10 WHERE memberid=1") ;if($return == false) {throw new Exception("庫dbtest1@172.20.101.18執行update memberpoints操作失敗!");}//階段1:$dbtest1提交準備就緒$dbtest1->query("XA END '$xid'");$dbtest1->query("XA PREPARE '$xid'");//階段1:$dbtest2提交準備就緒$dbtest2->query("XA END '$xid'");$dbtest2->query("XA PREPARE '$xid'");//階段2:提交兩個庫$dbtest1->query("XA COMMIT '$xid'");$dbtest2->query("XA COMMIT '$xid'");
}
catch (Exception $e) {//階段2:回滾$dbtest1->query("XA ROLLBACK '$xid'");$dbtest2->query("XA ROLLBACK '$xid'");die($e->getMessage());
}$dbtest1->close();
$dbtest2->close();?>
XA的性能很低。一個數據庫的事務和多個數據庫間的XA事務性能對比可發現,性能差10倍左右
https://blog.csdn.net/soonfly/article/details/70677138
這里先聲明兩個概念:
資源管理器(resource manager):用來管理系統資源,是通向事務資源的途徑。數據庫就是一種資源管理器。資源管理還應該具有管理事務提交或回滾的能力。
事務管理器(transaction manager):事務管理器是分布式事務的核心管理者。事務管理器與每個資源管理器(resource
manager)進行通信,協調并完成事務的處理。事務的各個分支由唯一命名進行標識。
mysql在執行分布式事務(外部XA)的時候,mysql服務器相當于xa事務資源管理器,與mysql鏈接的客戶端相當于事務管理器。
分布式事務原理:分段式提交
分布式事務通常采用2PC協議,全稱Two Phase Commitment Protocol。該協議主要為了解決在分布式數據庫場景下,所有節點間數據一致性的問題。分布式事務通過2PC協議將提交分成兩個階段:
prepare;
commit/rollback
階段一為準備(prepare)階段。即所有的參與者準備執行事務并鎖住需要的資源。參與者ready時,向transaction manager報告已準備就緒。
階段二為提交階段(commit)。當transaction manager確認所有參與者都ready后,向所有參與者發送commit命令。
如下圖所示:
總結
以上是生活随笔為你收集整理的Mysql跨数据库事务的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。