本文实例讲述了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