还没记住事务的隔离级别情况???
在使用数据库MySQL的时候,通常会遇到事务的问题,(嗯嗯,等下顺便提一下事务的隔离级别ACID)。这个时候在不同的数据库引擎提供了不同的隔离级别,也是针对不同的情况带来一定的解决办法。当然,就需要我们去实践和学习一下其中的过程啦。
事务特征
首先拎一下知识点,就是ACID的概念哈
A.原子性(Atomicity):事务开始,要么昨做完,要么不做 C.一致性(Consistency):数据库的完整性不被破坏,例如数据总值在事务前后不变 I.隔离性(Isolation):多个事务之间没有干扰 D.持久性(Durability):就是事务执行完之后不会丢失,被保存
事务的隔离级别
前面所提到的就包括一下几个:
-
read-uncommitted 读未提交 -
read-committed 读已提交 -
repeatable-read 可重复读 -
serializable 串行化
然后在上述的隔离级别中,可能会存在一下几个的问题:
脏读
事务A读取事务B更新的数据,当B回滚的时候,A读取到的之前的数据就是脏数据。
不可重复读
就是事务A多次读取同一数据,但是在别的事务中修改了事务A中读取的数据并且提交,导致A多次读取的事务出现不一致的情况。
幻读
在保证不可重复度读的情况下,事务A多次读取数据,但是此时别的事务对这个表的记录进行增删,导致事务A查询的时候多了或者少了几行
实际操作下
MySQL默认隔离级别
首先使用select @@tx_isolaction
查询一下,可以看到是可重复读的级别
读未提交
-
前置设置,设置隔离级别未读未提交,并且一个窗口开启事务,分别在另一个窗口中开启事务进行数据修改前后查询,可以发现在事务提交之前本窗口的数据就会发生变化。
-
另开一个事务,并且修改数值
读已提交
-
开启事务为读已提交,并且修改数据
-
当前事务在读已提交的状态下查询另一个事务未提交,已提交的数据,可以看到提交后才会有有影响。
可重复读
-
首先开启重复读,在数据修改事务提交前后查询,可以看到没有变化
-
在重复度情况下进行数据修改并提交
-
这时候进行插入数据,当前事务中可以看到数据增加一条
-
但是回到另一个,查询发现并没有发现数据,(没有出现幻读情况,实际上是MySQL中使用了MVCC机制,在可重复读的情况下避免幻读)
串行化
这个情况就是事务进行排队,各不影响,不过性能比较低。
最后来个烂大街的总结
事务隔离级别 | 脏读 | 不可重读读 | 幻读 |
---|---|---|---|
read uncommitted | 是 | 是 | 是 |
read committed | 否 | 是 | 是 |
repeatable read | 否 | 否 | 是(MySQL否) |
serializable | 否 | 否 | 否 |