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.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容