暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

IRONIC Bo 2021-06-16
913

在使用数据库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


文章转载自IRONIC Bo,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论