vlambda博客
学习文章列表

还没记住事务的隔离级别情况???

在使用数据库MySQL的时候,通常会遇到事务的问题,(嗯嗯,等下顺便提一下事务的隔离级别ACID)。这个时候在不同的数据库引擎提供了不同的隔离级别,也是针对不同的情况带来一定的解决办法。当然,就需要我们去实践和学习一下其中的过程啦。

事务特征

首先拎一下知识点,就是ACID的概念哈

A.原子性(Atomicity):事务开始,要么昨做完,要么不做 C.一致性(Consistency):数据库的完整性不被破坏,例如数据总值在事务前后不变 I.隔离性(Isolation):多个事务之间没有干扰 D.持久性(Durability):就是事务执行完之后不会丢失,被保存

事务的隔离级别

前面所提到的就包括一下几个:

  1. read-uncommitted 读未提交
  2. read-committed 读已提交
  3. repeatable-read 可重复读
  4. serializable 串行化

然后在上述的隔离级别中,可能会存在一下几个的问题:

脏读

事务A读取事务B更新的数据,当B回滚的时候,A读取到的之前的数据就是脏数据。

不可重复读

就是事务A多次读取同一数据,但是在别的事务中修改了事务A中读取的数据并且提交,导致A多次读取的事务出现不一致的情况。

幻读

在保证不可重复度读的情况下,事务A多次读取数据,但是此时别的事务对这个表的记录进行增删,导致事务A查询的时候多了或者少了几行

实际操作下

MySQL默认隔离级别

首先使用select @@tx_isolaction查询一下,可以看到是可重复读的级别

还没记住事务的隔离级别情况???

读未提交

  1. 前置设置,设置隔离级别未读未提交,并且一个窗口开启事务,分别在另一个窗口中开启事务进行数据修改前后查询,可以发现在事务提交之前本窗口的数据就会发生变化。
还没记住事务的隔离级别情况???
read uncommitted
  1. 另开一个事务,并且修改数值
还没记住事务的隔离级别情况???
read committed

读已提交

  1. 开启事务为读已提交,并且修改数据
还没记住事务的隔离级别情况???
read committed
  1. 当前事务在读已提交的状态下查询另一个事务未提交,已提交的数据,可以看到提交后才会有有影响。
还没记住事务的隔离级别情况???
read committed

可重复读

  1. 首先开启重复读,在数据修改事务提交前后查询,可以看到没有变化
还没记住事务的隔离级别情况???
repeatable
  1. 在重复度情况下进行数据修改并提交
还没记住事务的隔离级别情况???
repeatable
  1. 这时候进行插入数据,当前事务中可以看到数据增加一条
repeatable
  1. 但是回到另一个,查询发现并没有发现数据,(没有出现幻读情况,实际上是MySQL中使用了MVCC机制,在可重复读的情况下避免幻读)
repeatable

串行化

这个情况就是事务进行排队,各不影响,不过性能比较低。

最后来个烂大街的总结

事务隔离级别 脏读 不可重读读 幻读
read uncommitted
read committed
repeatable read 是(MySQL否)
serializable