本文實例講述了mysql跨庫事務XA操作。分享給大家供大家參考,具體如下:
前一段時間在工作中遇到了跨庫事務問題,后來在網上查詢了一下,現在做一下整理和總結。
1、首先要確保mysql開啟XA事務支持
1
|
SHOW VARIABLES LIKE '%XA%' |
如果innodb_support_xa的值是ON就說明mysql已經開啟對XA事務的支持了。
如果不是就執行:
1
|
SET innodb_support_xa = ON |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<?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'" ); //準備事務2 try { //$dbtest1 $return = $dbtest1 ->query( "UPDATE member SET name='唐大麥' WHERE id=1" ) ; if ( $return == false) { } //$dbtest2 $return = $dbtest2 ->query( "UPDATE memberpoints SET point=point+10 WHERE memberid=1" ) ; if ( $return == false) { } //階段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倍左右
希望本文所述對大家MySQL數據庫計有所幫助。
原文鏈接:https://www.cnblogs.com/isuben/p/7908468.html