日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql跨数据库事务

發(fā)布時間:2024/1/18 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql跨数据库事务 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

跨庫事務(wù)問題
在一個mysql實(shí)例中,現(xiàn)有A庫和B庫,在一個事務(wù)里同時向兩庫各表插入一條數(shù)據(jù),這時就涉及一個事務(wù)跨不同庫的問題

1、首先要確保mysql開啟XA事務(wù)支持
SHOW VARIABLES LIKE ‘%XA%’

2.如果innodb_support_xa的值是ON就說明mysql已經(jīng)開啟對XA事務(wù)的支持了。
如果不是就執(zhí)行:
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事務(wù)指定一個id,xid 必須是一個唯一值。 $xid = uniqid("");//兩個庫指定同一個事務(wù)id,表明這兩個庫的操作處于同一事務(wù)中 $dbtest1->query("XA START '$xid'");//準(zhǔn)備事務(wù)1 $dbtest2->query("XA START '$xid'");//準(zhǔn)備事務(wù)2try {//$dbtest1$return = $dbtest1->query("UPDATE member SET name='唐大麥' WHERE id=1") ;if($return == false) {throw new Exception("庫dbtest1@172.20.101.17執(zhí)行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執(zhí)行update memberpoints操作失敗!");}//階段1:$dbtest1提交準(zhǔn)備就緒$dbtest1->query("XA END '$xid'");$dbtest1->query("XA PREPARE '$xid'");//階段1:$dbtest2提交準(zhǔn)備就緒$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的性能很低。一個數(shù)據(jù)庫的事務(wù)和多個數(shù)據(jù)庫間的XA事務(wù)性能對比可發(fā)現(xiàn),性能差10倍左右

https://blog.csdn.net/soonfly/article/details/70677138

這里先聲明兩個概念:

資源管理器(resource manager):用來管理系統(tǒng)資源,是通向事務(wù)資源的途徑。數(shù)據(jù)庫就是一種資源管理器。資源管理還應(yīng)該具有管理事務(wù)提交或回滾的能力。
事務(wù)管理器(transaction manager):事務(wù)管理器是分布式事務(wù)的核心管理者。事務(wù)管理器與每個資源管理器(resource
manager)進(jìn)行通信,協(xié)調(diào)并完成事務(wù)的處理。事務(wù)的各個分支由唯一命名進(jìn)行標(biāo)識。
mysql在執(zhí)行分布式事務(wù)(外部XA)的時候,mysql服務(wù)器相當(dāng)于xa事務(wù)資源管理器,與mysql鏈接的客戶端相當(dāng)于事務(wù)管理器。

分布式事務(wù)原理:分段式提交
分布式事務(wù)通常采用2PC協(xié)議,全稱Two Phase Commitment Protocol。該協(xié)議主要為了解決在分布式數(shù)據(jù)庫場景下,所有節(jié)點(diǎn)間數(shù)據(jù)一致性的問題。分布式事務(wù)通過2PC協(xié)議將提交分成兩個階段:

prepare;
commit/rollback
階段一為準(zhǔn)備(prepare)階段。即所有的參與者準(zhǔn)備執(zhí)行事務(wù)并鎖住需要的資源。參與者ready時,向transaction manager報(bào)告已準(zhǔn)備就緒。
階段二為提交階段(commit)。當(dāng)transaction manager確認(rèn)所有參與者都ready后,向所有參與者發(fā)送commit命令。
如下圖所示:

總結(jié)

以上是生活随笔為你收集整理的Mysql跨数据库事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。