昨天对@Transactional中的传播做了记录,今天顺便把@Transactional整体做个了解
value
transactionManager的别名,可以指定使用事务管理器。在一个系统中可以指定不同的事务管理器。
propagation
事务传播行为。
这个已经在昨天做了记录。
isolation
事务隔离级别。默认是DEFAULT,这是专门为事务传播行为(REQUIRED或REQUIRES_NEW)设计的,因为它只适用于新启动的事务。
一共有4种隔离:
READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
READ_UNCOMMITTED(未提交读)
最低的隔离级别,事务未提交前,就可能被其他事务读取,会出现幻读,脏读,不可重复读。
READ_COMMITTED(提交读)
一个事务提交后才能被其他事务读取到,会造成幻读,不可重复读。
REPEATABLE_READ(可重复读,默认级别)
保证多次读取同一个数据时,其值和事务开始的时候都是一致的,禁止读取到别的事务未提交的数据,会造成幻读。
SERIALIZABLE(序列化)
这是一个代价比较高的隔离级别,可以防止脏读、幻读、不可重复度。
脏读:
一个事务可以读取到另一个事务中未提交的数据
不可重复读:
在一个事务内,多次读取同一个数据
幻读
在一个事务内多次查询的结果不同,可能造成的原因是被另一个事务新增或者删除了第一个事务中的数据,同一个记录的数据被修改了,所有的记录也就发生了改变。
timeout
事务的超时时间,默认为底层事务系统的默认超时(-1),专门为REQUIRED或REQUIRES_NEW新启动的事务
readonly
只读事务(默认false),如果在只读事务时发生了异常,只读事务也是会忽略异常。
从设置的时间点到事务结束的过程中,其他事务提交的数据修改都会忽视,这是就是只读数据为了保障数据的一致性。比如报表查询是一次执行多个查询,这时候就是保障数据的一致性(因为在查询过程中可能有数据会被修改)
rollbackFor
导致事务回滚的异常类数组,必须是Throwable下的子类,默认情况下是在RuntimeException和 Error上回滚
rollbackForClassname
导致事务回滚的异常类名字数组
noRollbackFor
不会导致事务回滚的异常类数组
noRollbackForClassName
不会导致事务回滚的异常类名字数组