MySQL事务隔离级别介绍和实战

事务还会通过锁机制满足隔离型。在InnoDB存储引擎中,有不同的隔离级别,它们有着不同的隔离性。
为什么要设置隔离级别?在数据库操作中,在并发的情况下可能会出现如下问题:

  • 脏读(Dirty Read):当前事务能够看别的事务未提交的数据。A事务读取B事务尚未提交的数据并在此基础上操作,而B事务进行回滚,那么A读取到的数据就是脏数据。

    解决方法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可避免该问题。
    
  • 不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。事务A读取某一数据后,事务B对其做了修改,当事务A再次读该数据时得到与前一次不同的值。

    解决方法:如果只有在修改事务完全提交之后才可以读取数据,则可避免该问题。
    
  • 幻读:在其中一个事务中读取到了其他事务新增的数据,仿佛出现了幻影现象。

    解决方法:在操作事务完成数据处理之前任何其他事务都不可以添加新数据,则可避免该问题。
    

正是为了解决以上情况,数据库提供了4种隔离级别,由低到高依次为 read uncommited(读未提交)、read committed(读已提交)、repeatable read(可重复读取)、serializable(序列化)。

  • 读未提交:在读未提交这个隔离级别下,即使别的事务所做的修改并未提交,也能看到其修改的数据。当事务的隔离级别处于“读未提交”时,其并发性能是最强的,但是隔离性与安全性是最差的,会出现脏读,在生产环境中不使用。
  • 读已提交:读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。该隔离级别避免了脏读,但是却可能出现不可重复读。例如,事务A事先读取了数据,事务B紧接着更新并提交了事务,当事务A再次读取该数据时数据已经发生改变。
  • 可重复读:是指在一个事务内多次读同一数据。假设在一个事务还没结束时,另一个事务也访问同一数据,那么在第一个事务中的两次读数据之间,即使第二个事务对数据进行了修改,第一个事务两次读到的数据也是一样的。这样在一个事务内两次读到的数据就是一样的,因此称为可重复读。读取数据的事务禁止写事务(但允许读事务),写事务则禁止任何其他事务,这样即可避免不可重复读和脏读,但是有时可能出现幻读。
  • 序列化:提供严格的事务隔离。它要求事务序列化执行,即事务只能一个接着一个地执行,但不能并发执行。仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也最高,性能很低,一般很少使用。在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读、还避免了幻读。

使用show variables like ‘tx_isolation’语句可以查看当前设置的隔离级别,如下图所示:
在这里插入图片描述
可以通过参数配置MySQL的事务隔离级别,注意不是tx_isolation,而是transaction_isolation。例如,在my.cnf配置文件中设置transaction_isolation=REPEATABLE-READ。也可以使用set语句设置当前会话隔离级别,比如set session transaction isolation level repeatable read。
我们先来总结以下MySQL默认事务隔离级别(可重复读隔离级别)的特性,如下图所示,在会话1与会话2中同时开启两个事务,在事务1的事务中修改了t1表的数据以后(将第二条数据的name的值修改为ddd),事务2中查看到的数据仍然是事务1修改之前的数据。
在这里插入图片描述
如下图所示,即使事务1提交了,在事务2没有提交之前,事务2查看到的数据都是相同的。不管事务1是否提交,在事务2没有提交之前,这条数据对于事务2来说一直都是没有发生改变的,这条数据在事务2中可以被重复地读到。
在这里插入图片描述
但是,可能会有一个问题,之前说过,事务的隔离性是由锁来实现的,那么当事务1中执行更新语句时,应该对数据增加了排他锁,但是事务2中仍然可以进行操作,为什么呢?
这是因为InnoDB采用了“一致性非锁定读”的机制,提高了数据库并发性。一致性非锁定读表示如果当前行被施加了拍他锁,那么当需要读取行数据时,则不会等待行上锁的释放,而是去读取一个快照数据。
InnoDB中一致性非锁定读的过程之所以称为非锁定读,是因为它不需要等待被访问的行上拍他锁的释放。其实快照就是该行所对应的之前版本已提交的数据,即历史数据,快照的实现是由事务日志所对应的undo段来完成的。

猜你喜欢

转载自blog.csdn.net/qq_36588424/article/details/112462819