一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

首先说一下数据库事务的四大特性

  

1酸

  

事务的四大特性是酸(不是“酸“....)

  

<强>(1)答:原子性(原子性)

  

原子性指的是事务要么完全执行,要么完全不执行。

  

<>强(2)C:一致性(一致性)

  

事务完成时,数据必须处于一致的状态。若事务执行途中出的错,会回滚到之前的事务没有执行前的状态,这样数据就处于一致的状态。若事务出错后没有回滚,部分修改的内容写入到了数据库中,这时数据就是不一致的状态。

  

<>强(3)我:隔离性(隔离)

  

同时处理多个事务时,一个事务的执行不能被另一个事务所干扰,事务的内部操作与其他并发事务隔离。

  

<>强(4)D:持久性(耐久性)

  

事务提交后,对数据的修改是永久性的。

  

2 Mysql的锁

  

Mysql的锁其实可以按很多种形式分类:

  
      <李>按加锁机制分,可分为乐观锁与悲观锁。   <李>按兼容性来分,可分为X锁与锁。   <李>按锁粒度分,可分为表锁,行锁,页锁。   <李>按锁模式分,可分为记录锁,锁的差距,第二个关键锁,意向锁、插入意向锁。   
  

这里主要讨论年代锁,X锁,乐观锁与悲观锁。

  

(1) S锁与X锁

  

<强> S锁与X锁是InnoDB引擎实现的两种标准行锁机制强。查看默认引擎可使用

  
 <代码类=" sql语言">显示变量如% storage_engine %的; 
  

作者的mysql版本为8.0.17,结果如下:

  

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

先建好测试库与测试表,很简单,表就两个字段。

  
 <代码类=" sql语言">创建数据库测试;
  使用测试;
  创建表
  (
  id auto_increment int主键,
  钱int
  ); 
  

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

Ⅰ.S锁

  

<强> S锁也叫共享锁,读锁,数据只能被读取不能被修改。
玩一下,上锁!

  
 <代码类=" sql语言">锁表读; 
  

然后.....   

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

只能读不能改,删,也不能增。

  

Ⅱ.X锁

  

<强> X锁也叫排他锁,写锁,一个事务对表加锁后,其他事务就不能对其进行加锁与增删查改操作。

  

设置手动提交,开启事务,X锁上。

  
 <代码类=" sql语言">设置autocmmmit=0;
  开始事务;
  锁表写; 
  

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

在开启另一个事务,使语用选择句。

  
 <代码类=" sql语言">设置自动提交=0;
  开始事务;
  select *的; 
  

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

这里是阻塞选择操作,因为一直都没释放X锁。

  

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

同样也不能再加锁,也是阻塞中。

  

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

回到原来那个加锁的事务,嗯,什么事也没有,正常读写。

  

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

释放锁后:

  
 <代码类=" sql语言">解锁表; 
  

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离

  

在另一个事务中可以看到中断时间。

一文带你理解脏读,幻读,不可重复读与mysql的锁,事务隔离