数据库和Spring事务隔离级别

文章详细介绍了数据库中的四个事务隔离级别——读未提交、读已提交、可重复读和串行化,以及它们在处理并发事务时对数据可见性的影响。特别提到了MySQL的默认隔离级别是可重复读,而Oracle只支持串行化和读已提交。此外,文章还讨论了Spring框架中的事务隔离级别,包括一个额外的DEFAULT级别,以及如何在编程式和声明式事务中设置这些级别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务隔离级别,指的是数据库多个并发事务操作共享数据时,共享的数据对多个并发事务之间的可见性和影响程度。隔离的内容主要指数据方面。具体举例来说就是一个事务A读操作时,其他并发事务修改操作事务A读的数据时,隔离级别设置对事务A的可见性。

一、Mysql数据库的4个事务隔离级别

1、READ_UNCOMMITTED读未提交,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读
2、READ_COMMITTED读已提交,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读
3、REPEATABLE_READ可重复读,它能确保同一事务多次查询的结果一致。但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但自己就是插入不进去,这就叫幻读 (Phantom Read);
4、SERIALIZABLE串行化,最高的事务隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。

注:

1、四种隔离级别,最高SERIALIZABLE级别,最低READ_UNCOMMITTED级别,级别越高,执行效率就越低;

2、隔离级别的设置只对当前链接有效,对JDBC操作数据库来说,一个Connection对象相当于一个链接,只对该Connection对象设置的隔离级别有效,与其它链接Connection对象无关。

3、Mysql的默认隔离级别是:可重复读:REPEATABLE_READ;

4、oracle数据库中,只支持SERIALIZABLE(串行化)级别和READ_COMMITTED(读已提交);默认的是READ_COMMITTED级别;

二、Spring的事务隔离级别

相比于 MySQL 的事务隔离级别,Spring 中多了一种 DEFAULT 的事务隔离级别

1、Isolation.DEFAULT:默认的事务隔离级别,以连接的数据库的事务隔离级别为准。
2、Isolation.READ_UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读。
3、Isolation.READ_COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。
4、Isolation.REPEATABLE_READ:可重复读,解决了不可重复读,但存在幻读(MySQL 数据库默认的事务隔离级别)。
5、Isolation.SERIALIZABLE:串行化,可以解决所有并发问题,但性能太低。
注意:

Spring 是事务隔离级别是建立在连接的数据库支持事务的基础上的 ,如果 Spring 项目连接的数据库不支持事务(或事务隔离级别),那么即使在 Spring 中设置了事务隔离级别,也是无效的设置。

在 Spring 中,事务的隔离级别有 2 种设置方法,

1、在编程式事务中设置事务隔离级别:

2、在声明式事务中设置事务隔离级别: 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值