事务的引入
3.在接口或类的声明处 写一个 @Transactional
事务的传播行为
默认 @Transactional(propagation=Propagation.REQUIRED)
如果有事务加入事务,没有创建一个事务。
Propagation.NOT_SUPPORTED 容器不为这个方法开启事务。
Propagation.REQUIRES_NEW 必须新创建事务,若有则挂起,等新事物执行完。
Propagation.MANDATORY 必须在一个已有事务中执行,否则报异常。
Propagation.NEVER 必须在没有事务中执行,否则会报异常。
Propagation.SUPPORTS 根据其被调用的bean,有事务则有,没则无。
事务的超时 默认30s @Transactional(timeout=30)
事务的隔离级别:
@Transactional(isolation = Isolation.READ_UNCOMMITTED) 读取未提交事件 (会出现脏读不可重复读)基本不适用
Isolation.READ_COMMITTED 读取已提交的事件,会出现 (不可重复读和幻读)
Isolation.REPEATABLE_READ 可重复读(会出现幻读)
Isolation.SERIALIZABLE 串行化
脏读: 一个事务读取另一个事务未提交的数据
幻读:一个事务读取另一个事务已提交的insert数据
不可重复读: 在同一个事务中,多次读取同一数据返回的结果有所不同
mysql 默认repeatable_READ 可重复读
sqlserver oracle read_commited
事务的注解里面有 异常回滚注解 必须在事务里。。。等
注解不能继承
spring事务的意见
1 @Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.
2用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException("注释");)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception("注释");)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚 要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
如下:
@Transactional(rollbackFor=Exception.class) //指定回滚,遇到异常Exception时回滚
public void methodName() {
throw new Exception("注释");
}
@Transactional(noRollbackFor=Exception.class)//指定不回滚,遇到运行期例外(throw new RuntimeException("注释");)会回滚
public ItimDaoImpl getItemDaoImpl() {
throw new RuntimeException("注释");
}
3、@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。
4、@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。然而,请注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据,能够被可以识别 @Transactional 注解和上述的配置适当的具有事务行为的beans所使用。上面的例子中,其实正是 <tx:annotation-driven/>元素的出现 开启 了事务行为。
5、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。