tidb的乐观锁功能bug

之前曾经用过springboot自带的乐观锁功能,就是在实体类中增加一个版本号字段,加上@Version注解。当时测试的时候是可以的,当实体类版本不对的时候,调用save方法就会抛出ObjectOptimisticLockingFailureException异常。但是后面我想加一个切面实现重试机制的时候发现突然行不通了,在tidb的环境下,会执行update set......where id = ? and version=?语句,却不抛出异常,如果这样的话乐观锁就完全没有用了。

当时花了我好长时间去寻找原因,后来发现当我去掉事务注解的时候tidb也能抛出异常,就是说是事务影响了tidb的乐观锁机制,然后我在网上寻找资料发现了这个

TiDB和Mysql的sql差异总结

我认为就是这个的原因,tidb在事务中不加锁,在提交时才加锁。但是代码中是不可能不用事务的,那么tidb环境下就不能实现springboot的乐观锁了,只能自己实现。。。。。。

tidb的坑真的很多,之前还碰到过先排序再分组语句失效的事情,和mysql不同,即使你在子查询中用了limit,子查询中的排序也不会生效,我不得不因此用更复杂的语句去实现这个功能。如果你把它当做mysql来使用那你就完蛋了,对于任何不确定的语句都要在tidb的环境中尝试一遍才行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章