标签:available err 处理 update 乐观 e8 mysql err1 where
在事务里,为了实现乐观锁,不使用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;
标签:available,err,处理,update,乐观,e8,mysql,err1,where 来源: https://www.cnblogs.com/huangliang-hb/p/16311564.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。