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

面试惊喜89:事务隔离级别和传播机制有什么区别?

时间:2023-04-02 02:01:34 Java

事务隔离级别和事务传播机制都规范了事务行为,但是两者描述的侧重点不同。本文提到的事务隔离级别和事务传播机制是指Spring框架中的机制。1、事务隔离级别事务隔离级别是事务四大隔离特性的具体体现。使用事务隔离级别可以控制并发事务在同时执行时的某些行为。比如有两个事务同时操作同一个表,一个事务修改了这个表的数据但是事务还没有提交,那么在另一个事务中,你想(或者你能)看到其他事务还没有提交事务?提交的数据呢?这个问题的答案取决于事务的隔离级别。不同的事务隔离级别对应的行为模式不同(有的隔离级别可以看到其他事务未提交的数据,有的事务隔离级别看不到其他事务尚未提交的数据),这就是事务隔离级别的作用.Sping中有五种事务隔离级别,分别是:DEFAULT:Spring中默认的事务隔离级别,以连接数据库的事务隔离级别为准;READ_UNCOMMITTED:读未提交,又称未提交读,隔离级别的事务可以从其他事务中看到未提交的数据。这个隔离级别可以读取其他事务中未提交的数据,而未提交的数据可能会被回滚,所以我们称这个级别读取的数据为脏数据,这种问题称为脏读;READ_COMMITTED:Readcommitted,也叫committedread,这个隔离级别的事务可以读取committed事务的数据,所以不会有脏读问题。但是,由于在事务执行过程中可以读取其他事务提交的结果,所以同一个SQL查询在不同的时间可能会得到不同的结果。这种现象称为不可重复读;REPEATABLE_READ:可重复读,它可以保证同一事务多次查询的结果是一致的。但也会出现新的问题。比如这个级别的事务正在执行的时候,另外一个事务成功插入了一条数据,但是因为每次查询的结果都是一样的,所以不会查询到这条数据,并且在重复插入时失败(由于唯一约束)。很显然,这个信息在事务中是查询不到的,但是它自己是不能插入的。这称为幻读(PhantomRead);SERIALIZABLE:序列化,最高的事务隔离级别,它会强制对事务进行排序,使其不会发生冲突,从而解决脏读、不可重复读、幻读等问题,但由于执行效率较低,实际用到的场景不多。因此,相对于MySQL的事务隔离级别,Spring多了一个DEFAULT事务隔离级别。事务隔离级别与问题的对应关系如下:脏读:一个事务读取到另一个事务修改的数据后,后一个事务执行回滚操作,导致第一个事务读取到错误的数据。不可重复读:一个事务的两次查询结果不同,因为另一个事务修改了两次查询之间的数据。幻读:一个事务的两次查询得到的结果集是不一样的,因为另一个事务在两次查询中添加了一些数据。在Spring中,可以通过@Transactional(isolation=Isolation.DEFAULT)设置事务隔离级别。2、事务传播机制Spring事务传播机制是指当包含多个事务的方法相互调用时,事务如何在方法间传播。Spring事务传播机制可以通过@Transactional(propagation=Propagation.REQUIRED)来设置,Spring事务传播机制的级别包括以下7种:Propagation.REQUIRED:默认的事务传播级别,表示如果一个事务当前存在,加入交易;如果没有当前事务,则创建一个新事务。Propagation.SUPPORTS:如果有当前事务,则加入该事务;如果没有当前事务,则继续以非事务方式运行。Propagation.MANDATORY:(强制:Mandatory)如果当前有事务,则加入事务;如果没有当前事务,则抛出异常。Propagation.REQUIRES_NEW:表示创建了一个新事务,如果当前存在事务,则挂起当前事务。也就是说不管外部方法是否启动事务,被Propagation.REQUIRES_NEW修饰的内部方法都会启动自己的事务,并且开启的事务相互独立,互不干扰。Propagation.NOT_SUPPORTED:以非事务模式运行,如果有当前事务,则暂停当前事务。Propagation.NEVER:以非事务方式运行,如果当前存在事务则抛出异常。Propagation.NESTED:如果当前有事务,则创建一个事务作为当前事务的嵌套事务运行;如果当前没有事务,这个值相当于PROPAGATION_REQUIRED。以上7种传播机制可以分为以下3类:总结从上面的介绍可以看出,事务隔离级别描述的是多个事务同时执行时的某种行为,它们的调用过程如下:而事务传播机制是对包含事务的多个方法相互调用时事务的传播行为的描述。它们的调用过程如下:所以事务隔离级别描述的是垂直事务并发调用时的行为模式,事务传播机制描述的是水平事务。交付时的行为模式。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview