lee 1241 0 2017-12-18 11:41:10

事务有四个特性:ACID

  • 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
  • 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
  • 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
Spring框架事务管理涉及的接口的联系如下:
1
@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      串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重

名词解释:
  • 脏读:一事务对数据进行了增删改,但未提交,另一事务可以读取到未提交的数据。如果第一个事务这时候回滚了,那么第二个事务就读到了脏数据。
  • 不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的。
  • 幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改。

提示:
  • 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
  • 大多数的数据库默认隔离级别为 Read Commited,比如 SqlServer、Oracle
  • 少数数据库默认隔离级别为:Repeatable Read 比如: MySQL InnoDB


Spring 中的隔离设置

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。