Spring框架事务管理涉及的接口的联系如下:
@Transactional的属性
属性名 | 类型 | 说明 |
isolation | 枚举org.springframework.transaction.annotation.Isolation的值 | 事务隔离级别 ,默认值Isolation.DEFAULT |
noRollbackFor | Class<? extends Throwable>[] | 一组异常类,遇到时不回滚。默认为{} |
noRollbackForClassName | Stirng[] | 一组异常类名,遇到时不回滚,默认为{} |
propagation | 枚举org.springframework.transaction.annotation.Propagation的值 | 事务传播行为 ,默认值 Propagation.REQUIRED |
readOnly | boolean | 事务读写性 ,默认false |
rollbackFor | Class<? extends Throwable>[] | 一组异常类,遇到时回滚 |
rollbackForClassName | Stirng[] | 一组异常类名,遇到时回滚 |
timeout | int | 超时时间,以秒为单位 ,ransactionDefinition.TIMEOUT_DEFAULT |
value | String | 可选的限定描述符,指定使用的事务管理器 |
事务传播行为类型 | 说明 |
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。默认值 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类 似的操作。 |
隔离级别 | 隔离级别的值 | 导致的问题 |
Read-Uncommitted | 0 | 导致脏读 |
Read-Committed | 1 | 避免脏读,允许不可重复读和幻读 |
Repeatable-Read | 2 | 避免脏读,不可重复读,允许幻读 |
Serializable | 3 | 串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重 |
名词解释:
提示:
ISOLATION_DEFAULT 这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与 JDBC 的隔离级别相对应。
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
注意:
1.使用注解事物,必须在spring配置中开启事物
2.@Transactional注解可以标注在类和方法上,也可以标注在定义的接口和接口方法上。
如果我们在接口上标注@Transactional注解,会留下这样的隐患:因为注解不能被继承,所以业务接口中标注的@Transactional注解不会被业务实现类继承。所以可能会出现不启动事务的情况。所以,spring建议我们将@Transaction注解在实现类上。
在方法上的@Transactional注解会覆盖掉类上的@Transactional。
http://blog.xqlee.com/article/81.html