mysql跨库事务XA操作示例
吾爱主题
阅读:134
2024-04-05 14:20:16
评论:0
本文实例讲述了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
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。