当前位置: 首页 > 后端技术 > Java

面试惊喜84:Spring有多少个事务隔离级别?

时间:2023-04-01 15:35:59 Java

Spring中的事务隔离级别与数据库中的事务隔离级别略有不同。以MySQL为例,MySQL的InnoDB引擎中有4个事务隔离级别,而Spring包含5个事务隔离级别。1、什么是事务隔离级别?事务隔离级别是事务四大特性隔离性的具体体现。使用事务隔离级别可以控制并发事务在同时执行时的某些行为。比如有两个事务同时操作同一个表,一个事务修改了这个表的数据但是事务还没有提交,那么在另一个事务中,你想(或者你能)看到其他事务还没有提交事务?提交的数据呢?这个问题的答案取决于事务的隔离级别。不同的事务隔离级别对应的行为模式不同(有的隔离级别可以看到其他事务未提交的数据,有的事务隔离级别看不到其他事务尚未提交的数据),这就是事务隔离级别的作用.2.Spring事务隔离级别Spring中有五种事务隔离级别,它们是:DEFAULT:Spring默认的事务隔离级别,以连接数据库的事务隔离级别为准;READ_UNCOMMITTED:读未提交,也叫未提交的提交读,这个隔离级别的事务可以看到其他事务中未提交的数据。这个隔离级别可以读取其他事务中未提交的数据,而未提交的数据可能会被回滚,所以我们称这个级别读取的数据为脏数据,这种问题称为脏读;READ_COMMITTED:Readcommitted,也叫committedread,这个隔离级别的事务可以读取committed事务的数据,所以不会有脏读问题。但是,由于在事务执行过程中可以读取其他事务提交的结果,所以同一个SQL查询在不同的时间可能会得到不同的结果。这种现象称为不可重复读;REPEATABLE_READ:可重复读,它可以保证同一事务多次查询的结果是一致的。但也会出现新的问题。比如这个级别的事务正在执行的时候,另外一个事务成功插入了一条数据,但是因为每次查询的结果都是一样的,所以不会查询到这条数据,并且在重复插入时失败(由于唯一约束)。很显然,这个信息在事务中是查询不到的,但是它自己是不能插入的。这称为幻读(PhantomRead);SERIALIZABLE:序列化,最高的事务隔离级别,它会强制对事务进行排序,使其不会发生冲突,从而解决脏读、不可重复读、幻读等问题,但由于执行效率较低,实际用到的场景不多。因此,相对于MySQL的事务隔离级别,Spring多了一个DEFAULT事务隔离级别。事务隔离级别与问题的对应关系如下:脏读:一个事务读取到另一个事务修改的数据后,后一个事务执行回滚操作,导致第一个事务读取到错误的数据。不可重复读:一个事务的两次查询结果不同,因为另一个事务修改了两次查询之间的数据。幻读:一个事务的两次查询得到的结果集是不一样的,因为另一个事务在两次查询中添加了一些数据。3.设置事务隔离级别在Spring中,设置事务隔离级别有两种方式,一种是在programmatictransaction中,可以通过以下代码设置事务隔离级别:另一种是在declarative中设置事务事务隔离级别,设置方法如下:总结Spring中的事务隔离级别比MySQL中的事务隔离级别多一级。它包含5个隔离级别:Isolation.DEFAULT:默认的事务隔离级别,以连接数据库的事务隔离级别为准。Isolation.READ_UNCOMMITTED:Readuncommitted,可以读取未提交的事务,存在脏读。Isolation.READ_COMMITTED:读已提交,只能读取已提交的事务,解决脏读和不可重复读。Isolation.REPEATABLE_READ:可重复读,解决不可重复读,但存在幻读(MySQL数据库默认的事务隔离级别)。Isolation.SERIALIZABLE:序列化可以解决所有的并发问题,但是性能太低了。但需要注意的是,Spring的事务隔离级别是基于连接的数据库支持事务的。如果Spring项目连接的数据库不支持事务(或者说事务隔离级别),那么即使在Spring中设置了事务隔离级别,仍然是Invalidsetting。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview