登录
首页 >  数据库 >  MySQL

事务隔离级别和锁引起的数据不一致

来源:SegmentFault

时间:2023-01-16 14:14:17 273浏览 收藏

本篇文章向大家介绍《事务隔离级别和锁引起的数据不一致》,主要包括MySQL、锁、事务,具有一定的参考价值,需要的朋友可以参考一下。

​最近生产环境零星出现了几笔脏数据,即同一业务编号出现了两条数据(我们系统中唯一性并未依靠于数据库的索引)。明明代码中已经加锁了, 还出现这样的问题,经定位,发现是事务的隔离性,导致第二个事务看不到第一个事务的数据,从而导致数据重复。

业务伪代码

// 省略了一些必要的异常处理。
@Transactional
public void saveAndComplete(T entity) {
    lock.lock();
    code = repository.findByCode(entity.getCode());
    if (code.isEmpty()) {
        repository.save(entity);
    }
    this.Complete(entity.getCode());
    lock.unlock();
}

​代码很简单,有一个

// 省略了一些必要的异常处理。
public void saveAndComplete(T entity) {
    lock.lock();
    transactionManager.getTransaction(); // 先获取锁,再开启事务
    code = repository.findByCode(entity.getCode());
    if (code.isEmpty()) {
        repository.save(entity);
    }
    this.Complete(entity.getCode());
    transactionManager.commit(); // 先提交事务,最后释放锁。
    lock.unlock();
}

到这里,我们也就讲完了《事务隔离级别和锁引起的数据不一致》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表