首页 > 数据库DBA > MYSQL > Mycat Select for update行级锁失败,排它锁失效.
2020
04-16

Mycat Select for update行级锁失败,排它锁失效.

mycat,阿里的mysql中间件,提供读写分离和分库分表方案。项目中主要使用的是其读写分离功能

问题:执行行级锁失败

查看下日志:

分析:

得出结果:

但是在单库环境下又正常,符合程序逻辑,这说明是mycat中间件搞得事情

查看官方最新文档:

主要查看mycat事务这一块内容(因为这块涉及我们上面的问题)

先来说说XA 事务原理(出自官方文档)

一般在编程中使用的方式是这样的:

  • 1.配置 TM,通过 TM 或者 RM 提供的方式,把 RM 注册到 TM。可以理解为给 TM 注册 RM 作为数据源。 一个 TM 可以注册多个 RM。
  • 2. AP 从 TM 获取资源管理器的代理(例如:使用 JTA 接口,从 TM 管理的上下文中,获取出这个 TM 所管 理的 RM 的 JDBC 连接或 JMS 连接)
  • 3.AP 向 TM 发起一个全局事务。这时,TM 会通知各个 RM。XID(全局事务 ID)会通知到各个 RM。
  • 4.AP 通过 TM 中获取的连接,直接操作 RM 进行业务操作。这时,AP 在每次操作时把 XID(包括所属分支的 信息)传递给 RM,RM 正是通过这个 XID 与 第二步中的 XID 关联来知道操作和事务的关系的。
  • 5.AP 结束全局事务。此时 TM 会通知 RM 全局事务结束。
  • 6. 开始二段提交,也就是 prepare – commit (准备提交)的过程。
  • 7.XA 协议(XA Specification) :解释如下

下面两个图片分别给出了 XA 成功与失败的两种情况,首先是 XA 事务成功的流程图:

然后,是 XA 事务失败的流程图:

XA 事务的关键在于 TM 组件,其中的难点技术点如下:

TM 是一定要把事务的信息,比如 XID,哪个 (数据库)RM 已经完成了等保存起来的。只有当全部的 RM 提交或者回 滚完后,才能丢弃这些事务的信息。

于是我们明白 TM 是一个单点,要非常可靠才行。

XA 操作说明

保证 repeatable read (划重点)

这样做的好处是可以保证连接可以最大限度的复用,提升性能。

问题原因说完了:下来修改

我当前的问题有2个

  • 1.需要将mycat升级到1.6.5版本后,因为我当前是1.6不支持XA事务隔离
  • 2. 将service.xml配置文件中的strictTxIsolation=true

上面2部修改都进行完成后,再次select form update

成功解决。

总结这次项目事件原因:

关于mysql事务隔离级别 请看这篇 传送门

最后编辑:
作者:shooter
这个作者貌似有点懒,什么都没有留下。