首页 > 编程知识 正文

mysql悲观锁应用场景,mysql乐观锁实现insert

时间:2023-05-06 15:24:16 阅读:126315 作者:2226

Mysql乐观锁定自旋不畅问题情景问题原因实例解决方案

场景

Mysql数据库、InnoDB引擎和事务级可重新装入。

表的结构如下。

用比较ver实现乐观锁定功能。 代码的大致逻辑如下。

1、开一个事务

2、用test_table查询id=1的数据,得到ver=2

3、处理业务逻辑

4、更新id=1数据的name为张四,ver=3,条件是ver=2,id=1

5、更新失败后,重复步骤2、3、4。

问题是只要更新失败,就一直失败2、3、4步。

原因执行步骤2后,另一个事务将ver更新为3,id=1的数据。 由于可以重复读取事务级别,因此select采用快照读取,而update是当前读取,因此select检测到的数据始终是当前事务启动时的快照,ver

例如,首先打开事务a,然后执行以下操作: begin;

select name,ver from test_table where id=1; 此时的结果如下。

此时,执行另一个事务b。

瓶子;

更新test _ table setver=3where id=1;

commit;

执行第一个事务的update语句,指示实际更新的行数为0。

此时,打开另一个窗口,检查id=1的该数据。 结果如下。

ver=3, 此时,事务a尚未提交。 在事务a中,再次执行select语句。 结果如下。

得到的还是ver=2。

从事务中提交解决方案查询,或者使重试逻辑独立于事务。 也就是说,a调用b,在a重试,在b打开事务。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。