简介
事务有多个隔离级别
- 读未提交(问题:脏读/不可重复读/幻读)
- 读已提交(问题:不可重复读/幻读)
- 重复读(问题:幻读)
- 串行化
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,它会自动更新,最后提交事物即可