mysql可重复读引发的问题

MySQL在可重复读的情况下,当一个线程去查询某条数据不存在在插入的情况下是不靠谱的,因为在开启事务到查询期间,有可能另一个线程已经插入了数据,而可重复读的情况下,单前事务是查询不到新插入的数据的,就会出现插入重复的情况,这时解决方法有:
1数据库加唯一索引
2在程序里使用分布式锁,程序拿到锁之后在执行查询,这时候的其他线程拿不到锁是不会插入的,所以这时候的查询时可靠的。
3在事务的查询用select …for update

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 可重复读(Repeatable Read)是指在一个事务中,查询的结果集是事务开始时刻的状态,即使其他事务对数据进行了修改,也不会影响当前事务中已经查询过的数据。 在可重复读的隔离级别下,MySQL 使用了多版本并发控制(MVCC)来实现。MVCC 在每个数据行上都会保存一个版本号,用于判断事务的可见性。当一个事务开始时,它会创建一个事务开始版本号,并在查询时只能看到该版本号之前的数据,而不会看到其他事务未提交的修改。 如果其他事务对数据进行了修改,但是还没有提交,那么当前事务中查询同样的数据时,会返回之前的版本。只有当其他事务将修改提交后,当前事务中的查询才会返回最新的数据。 需要注意的是,在可重复读隔离级别下,其他事务对数据的修改对当前事务是不可见的,但是当前事务对其他事务的修改是可见的。也就是说,如果当前事务修改了某个数据行,其他事务在查询该数据行时仍然会看到之前的值。 可以通过以下语句设置 MySQL 的隔离级别为可重复读: ``` SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 需要注意的是,可重复读虽然解决了脏读(Dirty Read)和不可重复读(Non-Repeatable Read)的问题,但是仍然存在幻读(Phantom Read)的情况。幻读是指在一个事务中,多次查询同样的条件,但是结果集的行数不一致。为了解决幻读问题,可以使用锁机制或者使用更高级别的隔离级别,如序列化(Serializable)隔离级别。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值