spring的事务:
什么是事务:
事务就是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。
事务的特性(四种):
原子性(atomicity):强调事务的不可分割。
一致性(consistency):事务执行前后的数据的完整性保持一致。
隔离性(isolation):一个事务在执行的过程中,不应该受到其他事务的干扰。
持久性(durability):事务一旦结束,数据就持久到数据库。
如果不考虑隔离性引发的安全性问题:
脏读:一个事务读到了另一个事务的未提交数据
不可重复读:一个事务读到了另一个事务的update的数据导致多次查询结果不一致。
虚幻读:一个事务读到了另一个事务的insert的数据导致多次查询结果不一致。
解决读的问题:设置事务隔离级别(5种)
public enum Isolation {
DEFAULT(-1),
READ_UNCOMMITTED(1),
READ_COMMITTED(2),
REPEATABLE_READ(4),
SERIALIZABLE(8);
}
使用方法:
@Transactional(isolation = Isolation.DEFAULT)
default:这是PlatfromTransactionManager默认的隔离级别,使用数据库的默认事务隔离级别。
read uncommited(未提交读):是最低的事务隔离级别,它允许当前事务可以看到这个事务未提交的数据。(脏读,不可重复读,续读都有可能发生 )
read commited(已提交读):是最低的事务隔离级别,它允许当前事务可以看到这个事务未提交的数据。(避免脏读,但是不可重复读和虚幻读都有可能发生)
repeatable read(可重复读):这个事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻读。它除了保证当前事物不能被另一个事务读取未提交的数据之外还避免了不可重复读。(避免脏读和不可重复读,但是虚读有可能发生)
serializable(串行化的):这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了脏读,不可重复读之外,还避免了幻读(避免的脏读、不可重复读和幻读)
√:可能出现 ×不会出现
事务的传播行为:(7种)
public enum Propagation {
REQUIRED(0),
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
}
使用方法:
@Transactional(propagation = Propagation.REQUIRED)
REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
REQUIRES_NEW:创建一个新的事务,如果当前存在事务;则把当前事务挂起。
NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务运行;如果当前没有事务,则该取值等价于REQUIRED