mysql读写分离实现事务_Mysql读写分离后的事务ce「建议收藏」

mysql读写分离实现事务_Mysql读写分离后的事务ce「建议收藏」1.概述很多人会有这样的疑问,mysql读写分离后,我的事务怎么处理呢。不是说mysql不支持跨库事务吗?那我引入mycat这个中间件后事务是否是安全的呢,它是怎么运作的呢。今天我们就来实验一下2.设置首先设置事务锁的过期时间是5innodb_lock_wait_timeout=5意思是前面有人已经锁定这一行准备更新了,而你现在又去更新这行,那你只能等,等5秒。前面的人还没进行事务提交,那…

大家好,又见面了,我是你们的朋友全栈君。

1 .概述

很多人会有这样的疑问,mysql读写分离后,我的事务怎么处理呢。

不是说mysql不支持跨库事务吗?

那我引入mycat这个中间件后事务是否是安全的呢,它是怎么运作的呢。

今天我们就来实验一下

2. 设置

首先设置事务锁的过期时间是5

innodb_lock_wait_timeout = 5

意思是前面有人已经锁定这一行准备更新了,而你现在又去更新这行,那你只能等,等5秒。前面的人还没进行事务提交,那你当前的进程就会报错

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

所以必须回滚。

3.主从库 各自开启事务实验,检验事务锁

来验证一下主库和从库 分别对同一行数据操作时 ,事务是否安全

主:

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from tb_books where id =2 for update;

+——+——-+———–+————+—-+

| name | price | bookCount | author | id |

+——+——-+———–+————+—-+

| 123 | 88 | 100 | beiduofen3 | 2 |

+——+——-+———–+————+—-+

1 row in set (0.08 sec)

表tb_books的id的主键,这里执行了行锁 ,然后去看看从服务器

从:

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

mysql> update tb_books set price=77 where id =2;

Query OK, 1 row affected (0.16 sec)

Rows matched: 1 Changed: 1 Warnings: 0

可以看到即使主服务器已经 把id=2 这行数据已经锁定, 但是从服务器还是可以更新到id为2的这条记录

由此可见,简单的读写分离 事务并不同步 。MySQL不支持跨库事务

那么我们只能借助mycat来实现弱跨库事务了

4 . 通过mycat 分别开始事务后,检验事务锁

配置: 已经用mycat 配置好主从读写分离

我们登陆mycat ,新开2个窗口进程,分别叫mycat1 和 mycat2

===mycat1 进程===

mysql> start transaction;

Query OK, 0 rows affected (0.08 sec)

mysql> select * from tb_books where id=1 for update;

+——+——-+———–+————+—-+

| name | price | bookCount | author | id |

+——+——-+———–+————+—-+

| 123 | 33 | 100 | beiduofen2 | 1 |

+——+——-+———–+————+—-+

1 row in set (0.04 sec)

mysql> update tb_books set price=9 where id =1;

Query OK, 1 row affected (0.17 sec)

Rows matched: 1 Changed: 1 Warnings: 0

这里我们没有操作提交或回滚。

然后我们继续转到mycat2进程操作

===mycat2 进程===

我们在这进行同样的操作

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

mysql> update tb_books set price=10 where id =1;

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

可以看到 mycat2进程 已经不能对id为1的记录进行操作 ,触发了行锁

而且在主数据库和从数据库的日志里 也没有发现此条sql日志。

由此看来应该是在mycat的层面上处理了。

并且如果该进程如果发生过事务 , 接下来的无论是select或update的操作都会发生在写主机上(不知道是不是我的设置问题), 无论执行多少次读的请求, 从主机都不会收到select的任务。(我的mycat策略是主数据库只负责写操作,从服务器只负责读操作)

要新进来的进程或这个进程已经断开,才会按读写分离规则分配。

5.日志和总结

这里记录下mycat触发行锁时 的日志

2020-02-03 04:55:04.437 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDatasource.releaseChannel(PhysicalDatasource.java:442)) – release channel MySQLConnection [id=12, lastTime=1580734504421, user=slaveuser, schema=testtest, old shema=testtest, borrowed=true, fromSlaveDB=true, threadId=62, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=192.168.133.135, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]

2020-02-03 04:55:04.437 DEBUG [$_NIOREACTOR-0-RW] (io.mycat.backend.datasource.PhysicalDatasource.releaseChannel(PhysicalDatasource.java:442)) – release channel MySQLConnection [id=6, lastTime=1580734504421, user=root, schema=testtest, old shema=testtest, borrowed=true, fromSlaveDB=false, threadId=28, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=localhost, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]

额外的一点知识

select * from information_schema.innodb_trx\G;

通过这个语句可以看到系统里的锁

总结一下。

单单读写分离配置后 事务安全需要借助mycat

6.参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134264.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicat15 永久激活码-激活码分享2022.02.27「建议收藏」

    (navicat15 永久激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年4月1日
    2.4K
  • PyCharm激活码永久有效PyCharm2018.1.5激活码教程-持续更新,一步到位

    PyCharm激活码永久有效PyCharm2018.1.5激活码教程-持续更新,一步到位PyCharm激活码永久有效2018.1.5激活码教程-Windows版永久激活-持续更新,Idea激活码2018.1.5成功激活

    2022年6月19日
    22
  • s一般怎么称呼自己的m_75.9%的职场人,都不知道怎么称呼自己的领导

    s一般怎么称呼自己的m_75.9%的职场人,都不知道怎么称呼自己的领导包邮送!人力资源制度手册纸质版和电子版23套制度覆盖员工入职到离职各环节82份表格制度配套全面规范附赠电子版可复制可编辑原价49元纸质版+电子版包邮送!!!最后30本!扫码回复【100】立抢!来源:猎聘(ID:liepinwang)作者:放学堵他谁能想到「怎么称呼别人」这样看似简单到不能再简单的问题,居然会成为让职场萌新发懵,甚至打怵的究极难题。不要以为这是什么夸张的说…

    2022年6月23日
    87
  • 移位运算「建议收藏」

    移位运算「建议收藏」【1】示例代码项目应用示例:【2】分析图解移位运算分析:【3】移位运算位运算应用口诀:清零取位要用与,某位置一可用或;若要取反和交换,轻轻松松用异或。【4】与移位运算有关的操作符优先级问

    2022年7月4日
    23
  • unity3d的入门教程_Unity3D缺点

    unity3d的入门教程_Unity3D缺点Unity3D新手入门初级教程U3D是由UnityTechnologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。可发布游戏至Windows、Mac、Wii、iPhone、Windowsphone8和Android平台。也可以利用Unitywebplayer插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Macwidgets所支持!U3D现已经占领了国内85%的手游

    2022年8月10日
    6
  • Python OSError: [Errno 22] Invalid argument:的出现和解决「建议收藏」

    Python OSError: [Errno 22] Invalid argument:的出现和解决「建议收藏」1、在学习从文件读取数据中,写了个示例代码,读取不在同一个目录的file.txt,运行后报这个PythonOSError:[Errno22]Invalidargument:错误:(1)、首先,在F盘的python_stu中新增了一个file.txt,同时在F盘的python_stu文件目录底下新增一个file文件夹,里面有个file_reader.py来读取python_stu文件目…

    2022年6月24日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号