mysql的乐观锁处理
2022/5/26 2:20:03
本文主要是介绍mysql的乐观锁处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在事务里,为了实现乐观锁,不使用select for update, 而是在update 的时候,进行条件判断 where xxx= select的值
const ( casRetries = 3 casInterval = 50 * time.Millisecond )
// 重试机制 + 乐观锁 for i := 0; i < casRetries; i++ { if principal, err = in.ByfiRepo.UpdateConfirmDailyPnl(ctx, &byfirepo.UpdatePnlParams{ ProductType: productType, LastDay: flexibleLastDay, FlexibleSavingParams: pnlRecord, }); err == nil { break } time.Sleep(casInterval) }
容易出现的坑:
1、当我们去update 某条语句时,假如条件不满足:
update wallets set available_balance_e8=available_balance_e8+144 where id=888888;
Rows matched: 0 Changed: 0 Warnings: 0
2、当我们去update 某条语句时,假如条件不满足:
update wallets set available_balance_e8=available_balance_e8+0 where id=1;
Rows matched: 1 Changed: 0 Warnings: 0
res, err1 := sql.Exec(ctx, tx) if err1 != nil { return err1 } affected, err := res.RowsAffected() if err != nil { return err1 } if affected == 0 { return errors.New("cas error, need try again") } 这个写法就有可能出问题,因为第二种情况,其实不算是错,而且我们可能在事务里确实需要用到,他能match,只是affected为0,但在这里 就是和第一种情况一样的当作错误去处理,就不对了
统计,coin=102,没有重复account_id的条数
select count(distinct account_id) from wallets where coin = 102;
这篇关于mysql的乐观锁处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-04部署MySQL集群项目实战:新手入门教程
- 2024-11-04如何部署MySQL集群资料:新手入门指南
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程
- 2024-11-01部署MySQL集群学习:新手入门教程
- 2024-11-01部署MySQL集群入门:新手必读指南
- 2024-10-23BinLog入门:新手必读的MySQL二进制日志指南
- 2024-10-23Binlog入门:MySQL数据库的日志管理指南