seata @GlobalLock的优化小需求

ztmd8pv5  于 2个月前  发布在  其他
关注(0)|答案(4)|浏览(27)

Why you need it?

关于@GlobalLock注解,client1.4.2。

场景:防止由于开发人员未遵循seata规范导致的线上出现数据类问题,加大上线安全率(防止挨骂),打算对已经涉及分布式事务表(即所有RM层的接口)加上@GlobalLock注解。

测试
1、debug发现RM层加上@GlobalLock也会做前后镜像,且前后镜像都对如update set语句非条件字段也做了镜像。
2、没有在逻辑开始前加上select ... for update,执行update语句后,@GlobalLock检查到全局锁存在后会立刻抛出异常; 而对于多事务用了@GlobalTransactional注解,都会等待其参数设定的时间。

需求
1、对于这种场景,希望优化@GlobalLock的“无谓”镜像。
2、希望能像@GlobalTransactional其作用,使在update语句上的@GlobalLock不加select ... for update,能够重试检查全局锁。
不愿加select ... for update 原因是对系统代码侵入较强。所以希望能多另一个新注解解决这个问题。

因场景经验不足,如诉求不合理,望指出,非常感谢。

fd3cxomn

fd3cxomn1#

Why you need it?

关于@GlobalLock注解,client1.4.2。

场景:防止由于开发人员未遵循seata规范导致的线上出现数据类问题,加大上线安全率(防止挨骂),打算对已经涉及分布式事务表(即所有RM层的接口)加上@GlobalLock注解。

测试: 1、debug发现RM层加上@GlobalLock也会做前后镜像,且前后镜像都对如update set语句非条件字段也做了镜像。 2、没有在逻辑开始前加上select ... for update,执行update语句后,@GlobalLock检查到全局锁存在后会立刻抛出异常; 而对于多事务用了@GlobalTransactional注解,都会等待其参数设定的时间。

需求: 1、对于这种场景,希望优化@GlobalLock的“无谓”镜像。 2、希望能像@GlobalTransactional其作用,使在update语句上的@GlobalLock不加select ... for update,能够重试检查全局锁。 不愿加select ... for update 原因是对系统代码侵入较强。所以希望能多另一个新注解解决这个问题。

因场景经验不足,如诉求不合理,望指出,非常感谢。

我们也有同类的需求, @cc1aymore 想请教下,你们有什么临时解决的方案吗?

oewdyzsn

oewdyzsn2#

@cc1aymore
对于您的问题
问题一:GlobalLock注解的定位是用于非Seata事务的读接口保证读隔离性,这里不应该做前后镜像,因为是select语句。
问题二:您是指的易用性上,想把在这个注解scope中的select语句自动加上for update。可以这样理解么?

5hcedyr0

5hcedyr04#

由于GlobalLock下不会注册分支,tc无法驱动这个事务的提交或回滚,所以无法锁重试,这个可以由业务侧自行重试
而GlobalLock下且没有xid时,会构建后镜像,这个没有意义,前镜像查到pk即可,事务的回滚提交都是由globllock的本地事务完成,不需要构建后镜像

相关问题