数据库的隔离级别就是控制并发情况下事务中间的数据读取,这些事物隔离级别就是为了处理脏读、幻读和不可重读的情况。
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)