各位用户为了找寻关于mysql跨库事务XA操作示例的资料费劲了很多周折。这里教程网为您整理了关于mysql跨库事务XA操作示例的相关资料,仅供查阅,以下为您介绍关于mysql跨库事务XA操作示例的详细内容
本文实例讲述了mysql跨库事务XA操作。分享给大家供大家参考,具体如下:
前一段时间在工作中遇到了跨库事务问题,后来在网上查询了一下,现在做一下整理和总结。
1、首先要确保mysql开启XA事务支持
? 1SHOW VARIABLES
LIKE
'%XA%'
如果innodb_support_xa的值是ON就说明mysql已经开启对XA事务的支持了。
如果不是就执行:
? 1SET
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