本文实例讲述了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) { 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倍左右
希望本文所述对大家MySQL数据库计有所帮助。
原文链接:https://www.cnblogs.com/isuben/p/7908468.html