事务隔离级别与事务传播行为简介

数据库的隔离级别就是控制并发情况下事务中间的数据读取,这些事物隔离级别就是为了处理脏读、幻读和不可重读的情况。
1. 脏读
在并发情况下,如果一个事务读取了另一个事务中未提交的数据,此时,如果另一个事务由于某种原因触发了数据回滚,那么
此时之前的事务读取到的数据就是脏数据,这个过程称为脏读。

脏读的解决办法就是让读取操作只能读取已提交的数据即可,我们只需要将事务的隔离级别设置为读已提交数据

2. 幻读
在并发情况下,如果一个事务对某一张表进行全表更新操作时,另一个事务又向该表中插入了一条数据,当前事务进行查询操
作,此时发现依然有未处理的数据,就像产生了幻觉一样,这个过程称为幻读

幻读的解决办法就是让事务的隔离级别设置为串行化,当然,我们一般不考虑这种情况,因为串行化会极大降低数据库的性能

3. 不可重复读
在并发情况下,如果一个事务前后两次读取数据的过程中,存在另一个事务将这条数据信息给更改了,导致当前事务前后两次
读取的数据不一致,这个过程称为不可重复读

不可重复读的解决办法就是将事务的隔离级别设置为可重复读。


spring中定义事务的隔离级别一共有5中:
DEFAULT, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE

spring事务传播行为一共有7种:
1. REQUIRED:表示如果当前存在事务,那么就在当前事务中执行。如果当前不存在事务,那么就会新建一个事务执行
环境1:当前有事务(Fetched SqlSession from current transaction)
环境2:当前没有事务(Creating a new SqlSession
           Registering transaction synchronization for SqlSession)

2. SUPPORTS: 表示支持当前事务,如果当前存在事务,那么就在当前事务中执行。如果当前不存在事务,那么就以非
事务的方式执行

环境1: 当前有事务(Fetched SqlSession from current transaction)
环境2: 当前没有事务(Closing non transactional SqlSession
            Creating a new SqlSession
            Registering transaction synchronization for SqlSession
            JDBC Connection will be managed by Spring
            Releasing transactional SqlSession
            Transaction synchronization deregistering SqlSession
            Transaction synchronization closing SqlSession),信息中没有committing信息,说明不是事务
3. MANDATORY: 表示支持当前事务,如果当前存在事务,那么就在当前事务中执行。如果当前不存在事务,那么就抛出异常
环境1: 当前有事务(Fetched SqlSession from current transaction)
环境2: 当前没有事务(org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory')

4. REQUIRES_NEW:表示在新的事务中执行,如果当前存在事务,就将当前事务挂起来,然后新建一个事务执行。如果当前
不存在事务,就直接新建一个事务执行。
环境1: 当前有事务(Transaction synchronization suspending SqlSession
           Creating a new SqlSession
           Registering transaction synchronization for SqlSession
           Releasing transactional SqlSession
           Transaction synchronization deregistering SqlSession
           Transaction synchronization closing SqlSession
           Transaction synchronization resuming SqlSession)
环境2: 当前没有事务(Creating a new SqlSession
            Registering transaction synchronization for SqlSession)

5. NOT_SUPPORTED:表示以非事务的方式执行,如果当前存在事务,则将当前事务给挂起来
环境1: 当前有事务(Transaction synchronization suspending SqlSession
           Creating a new SqlSession
           Registering transaction synchronization for SqlSession
           Releasing transactional SqlSession
           Transaction synchronization deregistering SqlSession
           Transaction synchronization closing SqlSession
           Transaction synchronization resuming SqlSession)
环境2: 当前没有事务(Creating a new SqlSession
            Registering transaction synchronization for SqlSession
            Releasing transactional SqlSession
            Transaction synchronization deregistering SqlSession
            Transaction synchronization closing SqlSession)
6. NEVER:表示以非事务的方式执行,如果当前存在事务,则抛出异常
环境1: 当前有事务(org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation 'never')
环境2: 当前没有事务(Creating a new SqlSession
            Registering transaction synchronization for SqlSession
            Releasing transactional SqlSession
            Transaction synchronization deregistering SqlSession
            Transaction synchronization closing SqlSession)
7. NESTED:表示如果当前存在事务,则嵌套在当前事务中执行,否则,其行为与REQUIRED一样
环境1: 当前有事务(Fetched SqlSession from current transaction)
环境2: 当前没有事务(Creating a new SqlSession
            Registering transaction synchronization for SqlSession
             Releasing transactional SqlSession
             Transaction synchronization committing SqlSession
             Transaction synchronization deregistering SqlSession
             Transaction synchronization closing SqlSession)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值