思考一: 当涉及到多张表的增删改和多个sql语句时,通常需要考虑使用事务,例如转账系统。需要考虑让多条sql语句同时成功或者同时失败。
**控制事务,事务的代码应该放在哪里:**应该放在service类的业务方法上,因为业务方法会调用多个dao方法,执行多个sql语句。
事务的隔离级别:
mysql默认使用的是可重复度,oracle默认是读已提交。
? READ_UNCOMMITTED:读未提交。未解决任何并发问题。 ? READ_COMMITTED:读已提交。解决脏读,存在不可重复读与幻读。 ? REPEATABLE_READ:可重复读。解决脏读、不可重复读,存在幻读 ? SERIALIZABLE:串行化。不存在并发问题。
事务的超 时时间
如果方法执行时超过了时间,食物就回滚。
事务的传播行为
所谓事务传播行为是指,处于不同事务中的方法在相互调用时,执行期间事务的维护情 况。
需要掌握: PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW PROPAGATION_SUPPORTS
解析: a、 PROPAGATION_REQUIRED: 指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中;若当前没有事 务,则创建一个新事务。这种传播行为是最常见的选择,也是 Spring 默认的事务传播行为。如该传播行为加在 doOther()方法上。若 doSome()方法在调用 doOther()方法时就是在事务内运行的,则doOther()方法的执行也加入到该事务内执行。若 doSome()方法在调用 doOther()方法时没有在事务内执行,则 doOther()方法会创建一个事务,并在其中执行。
b、PROPAGATION_SUPPORTS 指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。
c、 PROPAGATION_REQUIRES_NEW 总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事务执行完毕。
Spring 的回滚方式
Spring 事务的默认回滚方式是:发生运行时异常和 error 时回滚,发生受查(编译)异常时 提交。不过,对于受查异常,程序员也可以手工设置其回滚方式。
spring框架中提供的事务处理方案
- 适合中小项目使用的,注解方案,spring框架自己用aop实现给业务方法增加事务的功能,使用注解:@Transactional注解增加事务,他是spring框架自己的注解,这个注解放在public方法的上面,表示当前方法具有事务,可以给注解的属性赋值,表示具体的隔离级别,传播行为,异常信息等。
? propagation:用于设置事务传播属性。该属性类型为 Propagation 枚举,默认值为Propagation.REQUIRED。
? isolation:用于设置事务的隔离级别。该属性类型为 Isolation 枚举,默认值为Isolation.DEFAULT。
? readOnly:用于设置该方法对数据库的操作是否是只读的。该属性为 boolean,默认值为 false。
? timeout:用于设置本操作与数据库连接的超时时限。单位为秒,类型为 int,默认值为-1,即没有时限。
? rollbackFor:指定需要回滚的异常类。类型为 Class[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。
? rollbackForClassName:指定需要回滚的异常类类名。类型为 String[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。
? noRollbackFor:指定不需要回滚的异常类。类型为 Class[],默认值为空数组。当然,若只有一个异常类时,可以不使用数组。
? noRollbackForClassName:指定不需要回滚的异常类类名。类型为 String[],默认值为空数组。当然,若只有一个异常类时,可以不用数组。
需要注意的是,@Transactional 若用在方法上,只能用于 public 方法上。对于其他非 public方法,如果加上了注解@Transactional,虽然 Spring 不会报错,但不会将指定事务织入到该方法中。因为 Spring 会忽略掉所有非 public 方法上的@Transaction 注解。
若@Transaction 注解在类上,则表示该类上所有的方法均将在执行时织入事务。
实现注解的操作步骤:
- 声明事务管理器
- 开启注解驱动:通知spring,要使用注解的方式去管理事务,spring使用aop创建所在类的对象,给方法加入事务的功能。
|