并发场景下事务处理

文章介绍了数据库事务的几种隔离级别及其问题,如脏读、不可重复读和幻读。悲观锁在并发较高时使用,通过`select...forupdate`获取锁,而乐观锁适用于并发较低的情况,常通过版本号(version)或更新时间(updated_at)字段来防止冲突。GORM框架提供了使用updated_at字段进行乐观锁的便利方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

事务有多个隔离级别

  • 读未提交(问题:脏读/不可重复读/幻读)
  • 读已提交(问题:不可重复读/幻读)
  • 重复读(问题:幻读)
  • 串行化
    mysql 默认隔离级别为重复读,一般开发中,大多使用读已提交的隔离级别,也有一些采用重复读的隔离级别(具体隔离级别和带来的问题可以具体查明,这里不做赘述)

悲观锁

修改并发较多时候用(一般如果并发大的话,上面还会再加一层 redis 来滤过一部分流量)

开启事务后,select … for update 即可,在事务提交后或会滚后锁被释放

乐观锁

在修改的并发操作不多情况下可以用,如果修改的并发操作很多,那么会导致较多的用户请求失败

一种方式是数据库中弄一个 version 字段,先开启事务,然后取一下 version 字段,更新数据库时候判定 version 还是不是前面取的 version,是的话就更新,不是的话返回给用户端 mysql error(这里可以用循环重试机制,这样可以减少一些返回 error 给用户的情况,但肯定还是会有),最后事物提交

另外对于 golang 的 gorm 天然可以使用 updated_at 代替 version。比如事物开启,先拿到 updated_at,然后更新时候,判定一下 where updated_at 是否等于之前取到的,后面 updated_at 设置不需要你加 1,它会自动更新,最后提交事物即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abcnull

您的打赏是我创作的动力之一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值