我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mycat的使用 - 04.事务支持

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mycat的使用 - 04.事务支持

03全局序列号篇详细介绍了分片表, 业务在使用分片表时, 很自然的可能会遇到一个事务中操作的数据分布在多个分片节点上, 即分布式事务. 先来直观感受下Mycat处理事务的过程.


登陆tb3表的dnTest2节点主机, 操作如下.

mysql> set global innodb_lock_wait_timeout = 5;

Query OK, 0 rows affected (0.00 sec)


mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)


mysql> select user_name from tb3 where user_id = 59 for update;

+-----------+

| user_name |

+-----------+

| mnop_f    |

+-----------+

1 row in set (0.00 sec)


登陆Mycat, 开启一个事务, 结合日志看下该过程.

mysql> start transaction;

Query OK, 0 rows affected (0.01 sec)


mysql> update tb3 set user_name = 'igkl_2f' where user_id = 4;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1  Changed: 1  Warnings: 0


mysql> update tb3 set user_name = 'mnop_2f' where user_id = 59;

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

mysql> commit;

ERROR 1003 (HY000): Transaction error, need to rollback.

mysql> rollback;

Query OK, 0 rows affected (0.00 sec)


关键日志如下.

03/27 12:07:09.189  DEBUG [$_NIOREACTOR-1-RW] (ServerQueryHandler.java:56) -ServerConnection [id=2, schema=testdb, host=192.168.4.184, user=test_user,txIsolation=3, autocommit=true, schema=testdb]begin

03/27 12:16:33.019  DEBUG [$_NIOREACTOR-2-RW] (ServerQueryHandler.java:56) -ServerConnection [id=6, schema=testdb, host=192.168.4.184, user=test_user,txIsolation=3, autocommit=false, schema=testdb]update tb3 set user_name = 'igkl_2f' where user_id = 4

03/27 12:16:33.021  DEBUG [$_NIOREACTOR-2-RW] (NonBlockingSession.java:113) -ServerConnection [id=6, schema=testdb, host=192.168.4.184, user=test_user,txIsolation=3, autocommit=false, schema=testdb]update tb3 set user_name = 'igkl_2f' where user_id = 4, route={

   1 -> dnTest1{update tb3 set user_name = 'igkl_2f' where user_id = 4}

03/27 12:16:33.021  DEBUG [$_NIOREACTOR-2-RW] (MySQLConnection.java:459) -con need syn ,total syn cmd 3 commands SET names utf8;SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;SET autocommit=0;schema change:false con:MySQLConnection [id=8, lastTime=1522124193021, user=appacc, schema=test1, old shema=test1, borrowed=true, fromSlaveDB=false, threadId=28, charset=utf8, txIsolation=0, autocommit=true, attachment=dnTest1{update tb3 set user_name = 'igkl_2f' where user_id = 4}, respHandler=SingleNodeHandler [node=dnTest1{update tb3 set user_name = 'igkl_2f' where user_id = 4}, packetId=0], host=192.168.4.235, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]

03/27 12:16:52.795  DEBUG [$_NIOREACTOR-2-RW] (ServerQueryHandler.java:56) -ServerConnection [id=6, schema=testdb, host=192.168.4.184, user=test_user,txIsolation=3, autocommit=false, schema=testdb]update tb3 set user_name = 'mnop_2f' where user_id = 59

03/27 12:16:52.796  DEBUG [$_NIOREACTOR-2-RW] (NonBlockingSession.java:113) -ServerConnection [id=6, schema=testdb, host=192.168.4.184, user=test_user,txIsolation=3, autocommit=false, schema=testdb]update tb3 set user_name = 'mnop_2f' where user_id = 59, route={

   1 -> dnTest2{update tb3 set user_name = 'mnop_2f' where user_id = 59}

03/27 12:16:52.797  DEBUG [$_NIOREACTOR-2-RW] (MySQLConnection.java:459) -con need syn ,total syn cmd 3 commands SET names utf8;SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;SET autocommit=0;schema change:false con:MySQLConnection [id=20, lastTime=1522124212797, user=appacc, schema=test2, old shema=test2, borrowed=true, fromSlaveDB=false, threadId=8, charset=utf8, txIsolation=0, autocommit=true, attachment=dnTest2{update tb3 set user_name = 'mnop_2f' where user_id = 59}, respHandler=SingleNodeHandler [node=dnTest2{update tb3 set user_name = 'mnop_2f' where user_id = 59}, packetId=0], host=192.168.4.151, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]

03/27 12:16:58.800   WARN [$_NIOREACTOR-1-RW] (SingleNodeHandler.java:232) -execute  sql err : errno:1205 Lock wait timeout exceeded; try restarting transaction con:MySQLConnection [id=20, lastTime=1522124212784, user=appacc, schema=test2, old shema=test2, borrowed=true, fromSlaveDB=false, threadId=8, charset=utf8, txIsolation=3, autocommit=false, attachment=dnTest2{update tb3 set user_name = 'mnop_2f' where user_id = 59}, respHandler=SingleNodeHandler [node=dnTest2{update tb3 set user_name = 'mnop_2f' where user_id = 59}, packetId=1], host=192.168.4.151, port=3306, statusSync=org.opencloudb.mysql.nio.MySQLConnection$StatusSync@52530466, writeQueue=0, modifiedSQLExecuted=true] frontend host:192.168.4.184/59858/test_user

03/27 12:17:05.660  DEBUG [$_NIOREACTOR-2-RW] (ServerQueryHandler.java:56) -ServerConnection [id=6, schema=testdb, host=192.168.4.184, user=test_user,txIsolation=3, autocommit=false, schema=testdb]commit

03/27 12:17:08.868  DEBUG [$_NIOREACTOR-2-RW] (ServerQueryHandler.java:56) -ServerConnection [id=6, schema=testdb, host=192.168.4.184, user=test_user,txIsolation=3, autocommit=false, schema=testdb]rollback

03/27 12:17:08.870  DEBUG [$_NIOREACTOR-2-RW] (RollbackNodeHandler.java:79) -rollback job run for MySQLConnection [id=20, lastTime=1522124212784, user=appacc, schema=test2, old shema=test2, borrowed=true, fromSlaveDB=false, threadId=8, charset=utf8, txIsolation=3, autocommit=false, attachment=dnTest2{update tb3 set user_name = 'mnop_2f' where user_id = 59}, respHandler=SingleNodeHandler [node=dnTest2{update tb3 set user_name = 'mnop_2f' where user_id = 59}, packetId=1], host=192.168.4.151, port=3306, statusSync=org.opencloudb.mysql.nio.MySQLConnection$StatusSync@52530466, writeQueue=0, modifiedSQLExecuted=true]

03/27 12:17:08.870  DEBUG [$_NIOREACTOR-2-RW] (RollbackNodeHandler.java:79) -rollback job run for MySQLConnection [id=8, lastTime=1522124193010, user=appacc, schema=test1, old shema=test1, borrowed=true, fromSlaveDB=false, threadId=28, charset=utf8, txIsolation=3, autocommit=false, attachment=dnTest1{update tb3 set user_name = 'igkl_2f' where user_id = 4}, respHandler=SingleNodeHandler [node=dnTest1{update tb3 set user_name = 'igkl_2f' where user_id = 4}, packetId=1], host=192.168.4.235, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=true]


Mycat目前对于未分片的节点, 是可以保证事务的完整性的; 若是多个分片节点, 在执行事务时, 遇到任何分片出错, 也是能保证所有分片回滚的, 即上边展示的情况. 可是应用一旦进入commit过程, 若此时出现问题, 其就无能为力了, 这也是Mycat称之为弱XA的原因.


上述commit过程是指: InnoDB prepare, write/sync Binlog, InnoDB commit(其历经5.5至5.7版本的多次迭代优化, 这块内容也是精彩纷呈). 虽该阶段一般不会出现问题, 这也正暗示了Mycat在特殊情况下还不能保证分布式事务安全. 那应用架构中又如何实现可靠的分布式事务呢, 这又是另一个宏大的话题了...


若感兴趣可关注订阅号”数据库最佳实践”(DBBestPractice).

Mycat的使用 - 04.事务支持

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mycat的使用 - 04.事务支持

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

FMDB支持的事务类型有哪些

这篇文章主要为大家展示了“FMDB支持的事务类型有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“FMDB支持的事务类型有哪些”这篇文章吧。FMDB支持的事务类型在数据库中,事务可以保证数据操
2023-06-04

win7支持4g内存的使用方法

有网友反映说他的32位win7不能用4G的内存。其实32位的win7和vista都是不允许用4G内存的,那有没有让32位的win7/vista也用上4G的内存呢? 答案是可以,但是这样做的话很可能会破坏系统的稳定性。猜你喜欢:32位与64位
2023-05-26

轻量应用服务器5m支持多少人使用手机支付

轻量应用服务器5m可以支持大量人群使用手机支付,但是具体支持多少用户使用手机支付还有很多因素需要考虑,例如设备的处理能力、设备的可用性以及安全性等,因此需要进行具体的分析才能确定是否可行。一般来说,轻量应用服务器5m的处理能力相对较小,可能只能支持百万级别的用户,而支持千万级用户的服务器的处理能力可以轻松支持数十亿级别的用户,因此在可用性和处理能力方面会有更高的要求。此外,手机支付的交易系统
2023-10-26

ijkplayer打包支持https的so使用详解

这篇文章主要为大家介绍了ijkplayer打包支持https的so使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-16

轻量应用服务器5m支持多少人使用手机支付宝

首先,用户需要安装支付宝应用程序,并通过支付宝账号进行登录。如果用户未开通支付宝账号,则需要通过注册方式来获得支付宝账号。此外,用户还需要下载和安装支付宝应用程序,以及设置相关的支付宝账户信息和个人信息。为了满足用户的需求,手机支付宝不断更新和改进。现在,它已经支持多种支付方式,包括支付宝钱包、微信支付、银联支付等。此
轻量应用服务器5m支持多少人使用手机支付宝
2023-10-28

基于resty security的Api权限控制与事务支持的方法

这篇文章主要介绍了基于resty security的Api权限控制与事务支持的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于resty security的Api权限控制与事务支持的方法文章都会有所收获,
2023-06-29

轻量应用服务器5m支持多少人使用

轻量应用服务器可以支持多达500人使用,但这取决于您的应用程序和用户需求。如果您的应用程序需要处理大量数据,而且用户数量较多,您可能需要为该应用程序选择大型轻量应用服务器。如果您的应用程序主要是轻量级的,并且可以在较短的时间内部署,则可以选择中等大小或小型轻量应用服务器。如果您正在考虑部署大量的应用程序,则需要选择更大的轻量应用服务器。总之,您需要根据您的具体应用程序和要求来选择合适的服务器配置。
2023-10-25

阿里云服务器是否支持国外使用?

阿里云是中国最大的云计算服务提供商之一,它提供的服务器服务是否支持国外使用呢?本文将对此进行详细说明。正文:随着全球化的发展,越来越多的公司开始考虑将业务扩展到国外市场。然而,对于企业来说,选择合适的服务器服务是非常重要的。那么,阿里云服务器是否支持国外使用呢?首先,让我们了解一下什么是阿里云服务器。阿里云服务器
阿里云服务器是否支持国外使用?
2023-11-14

轻量应用服务器5m支持多少人使用手机支付功能

轻量应用服务器5m可以支持最多50人的手机支付功能。但是,具体支持的人数可能会有所不同,因为这取决于用户的使用情况和商户的需求。有些商户可能更喜欢接受支付宝和微信支付等支付方式,而有些商户可能更愿意使用ApplePay等移动支付方式。然而,如果用户只使用支付宝ApplePay或微信支付而不需要使用其他支付方式,那么5m支持的人数可能会更多。如果用户需要使用微信支付,那么支持的用户可能更广泛,可
2023-10-26

编程热搜

目录