Spring事务的实现方式和原理以及隔离级别?,springmvc事务隔离级别
Spring中的事务隔离级别与数据库中的略有不同。以MySQL为例。MySQL的InnoDB引擎有四个事务隔离级别,而Spring包含五个。
1.什么是事务隔离级别?事务隔离级别是事务的四个特征之间隔离的具体体现。使用事务隔离级别可以控制并发事务同时执行时的某些行为。
例如,有两个事务同时操作同一个表。此时,一个事务已经修改了该表的数据,但尚未提交该事务。那么,在另一个事务中,您希望(或者可以)看到其他事务的未提交数据吗?
这个问题的答案取决于事务隔离级别。不同的事务隔离级别有不同的行为模式(有些隔离级别可以看到其他事务的未提交数据,有些事务隔离级别看不到其他事务的未提交数据)。这就是事务隔离级别的作用。
2.Spring事务隔离级别在spring中有五种类型的事务隔离级别。它们是:
default:Spring中默认的事务隔离级别,以连接的数据库的事务隔离级别为准;READ_UNCOMMITTED:未提交读取,也称为未提交读取。此隔离级别的事务可以看到其他事务中未提交的数据。这个隔离级别可以读取其他事务中未提交的数据,未提交的数据可能会回滚,所以我们把这个级别读取的数据称为脏数据,这个问题称为脏读。READ_COMMITTED:读取已被提交,也称为提交读取。这个隔离级别的事务可以读取已提交事务的数据,所以不会有脏读的问题。但是,因为在事务执行期间可以读取其他事务提交的结果,所以在不同的时间,在同一SQL查询中可能会获得不同的结果。这种现象被称为不可重复读取。REPEATABLE_READ:可以重复读取,可以保证同一事务的多次查询结果一致。但是,也会出现新的问题。当这个级别的一个事务正在执行时,另一个事务成功插入了某一条数据,但是由于它每次查询的结果都是一样的,所以会导致它重复插入的失败(因为唯一约束)。很明显,你在一个交易中是找不到这些信息的,但是你自己也插不进去。这被称为幻像读取。SERIALIZABLE:最高的事务隔离级别Serialization将强制对事务进行排序,以便不会出现冲突,从而解决脏读、不可重复读和幻影读的问题。但由于执行效率低,实际使用的场景并不多。所以相对于MySQL的事务隔离级别,Spring中有一个默认的事务隔离级别。
事务级别与问题的对应关系如下:
脏读:一个事务读取了另一个事务修改的数据后,后一个事务再次回滚,导致第一个事务读取了错误的数据。不可重复读取:一个事务的两次查询结果不同,因为在两次查询中间,另一个事务修改了数据。魔读:一个事务的两次查询得到的结果集是不一样的,因为在两次查询中有一些数据被添加到了另一个事务中。3.设置事务隔离级别。在Spring中,有两种方法可以设置事务的隔离级别。一是在编程式事务中,事务隔离级别可以由以下代码设置:
另一个是在声明性事务中设置事务隔离级别。设置方法如下:
Spring中的事务隔离级别比MySQL多一级,它包含的五个隔离级别是:
孤立。DEFAULT:默认的事务隔离级别,它基于连接的数据库的事务隔离级别。孤立。READ _ UNCOMMITTED:READ UNCOMMITTED,可以读取未提交的事务,存在脏读。孤立。READ_COMMITTED:已经提交了读取,并且只能读取提交的事务。脏读已经解决了,还有一个不可重复的读。孤立。REPEATABLE_READ: Repeatable,解决了不可重复读取的问题,但是存在幻影读取(MySQL数据库默认的事务隔离级别)。孤立。可序列化:序列化可以解决所有并发问题,但是性能太低。但是,需要注意的是,Spring中的事务隔离级别是基于支持事务的连接数据库的。如果Spring项目连接的数据库不支持事务(或事务隔离级别),那么即使在Spring中设置了事务隔离级别,也是无效的。
版权归作者所有:原创作品来自博主小二上九8,转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。