mysql两个事务同时修改_mysql:如何解决数据修改冲突(事务+行级锁的实际运用)

本文通过一个接诊需求的案例,探讨了如何解决MySQL中两个事务同时修改同一数据导致的冲突。介绍了事务、事务隔离级别(读未提交、读已提交、可重复读、可串行化)以及行级锁(共享锁、排他锁)的概念,并提出在查询时使用`SELECT ... FOR UPDATE`来避免并发问题。
摘要由CSDN通过智能技术生成

摘要:最近做一个接诊需求遇到一个问题,假设一个订单咨询超过3次就不能再接诊,但如果两个医生同时对该订单进行咨询,查数据库的时候都能查到满足条件的该订单,那两个医生都能接诊,所谓接诊可以理解为更新了接诊次数,此时就出现了bug(接诊超过3次)。

其实这个问题看似很明朗,但想要完全解决需要理解事务和锁的概念,以前总对事务的隔离级别和锁有点云里雾里,现在可以通过这个案例可以理清楚。

事务

操作数据库最小的工作单位,简单讲就是将多条dml(增删改)语句联合完成。要么同时成功,要么同时失败。看到这里你可能会发现光加事务解决不了上述问题,而且加了事务之后,多条事务之间的相互关系就涉及到事务的隔离级别,所以接着往下看。

事务隔离级别

READ UNCOMMITTED(读未提交,脏读)

事务中的修改,即使没有提交,对其他会话也是可见的。可以读取未提交的数据——脏读。脏读会导致很多问题,一般不适用这个隔离级别.。

-- ------------------------- read-uncommitted实例 ------------------------------

-- 设置全局系统隔离级别

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- Session A

START TRANSACTION;

SELECT * FROM USER;

UPDATE USER SET NAME="READ UNCOMMITTED";

-- commit;

-- Session B

SELECT * FROM USER;

//SessionB Console 可以看到Session A未提交的事物处理࿰

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值