对于Spring的一个注册容器相当于一个事务,所以其中的方法调用
都在一个事务当中。
对于Spring注册的容器才能使用事务
对于事务Propagation.REQUIRED是将注册方法的事务加入到调用者的事务当中形成一个事
务;Propagation.REQUIRES_NEW是将注册方法的事务执行完毕后再执行调用者的事务,是两个事务。
示例:
容器A中
@Transactional(rollbackFor=MyException.class,
propagation=Propagation.REQUIRES_NEW)
public void test() throws MyException {
Project p = new Project();
p.setName("service tran1");
dao.save(p);
service.test();
---------------调用容器B的test()
}
容器B中
@Transactional(rollbackFor=MyException.class, propagation=
Propagation.REQUIRED)
public void test() throws MyException {
Project p = new Project();
p.setName("service2 tran1");
dao.save(p);
throw new MyException();
}
当B的事务申明为 propagation=
Propagation.REQUIRED时,B的事务加入到A形成一个事务,所以B检查到需要回滚后,这个新形成的事务回滚,A的数据也没有保存。
如果B的事务申明为propagation=Propagation.REQUIRES_NEW,那么B的事务是先commit再执行A的事务,那
么A的数据依然保存。
以下是载录网上内容:
Spring annotation对事务的管理
用 spring
事务管理器,由spring
来
负责数据库的打开,提交,回滚.默认遇到运行期例外
(throw new RuntimeException("注释");)会回滚:unchecked,需要捕获的例外(throw
new Exception("注释");)不会回滚:checked.
需要修改规则加入注释:
@Transactional(rollbackFor=Exception.class) //指定回滚,需要捕获的例外(throw
new Exception("注释");)不会回滚
public void methodName() {
throw new Exception("注释");
}
@Transactional(noRollbackFor=Exception.class)// 指定不回滚,遇到运行期例外
(throw new RuntimeException("注释");)会回滚
public ItimDaoImpl getItemDaoImpl() {
throw new RuntimeException("注释");
}
//事务传播属性
@Transactional(propagation=Propagation.REQUIRED) //如果有事务,那么加入事
务,没有的话 新建一个(不写的情况下)
@Transactional(propagation=Propagation.NOT_SUPPORTED) //容器不为这个方法
开启事务
@Transactional(propagation=Propagation.REQUIRES_NEW) //不管是否存在事务,
都创建 一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
@Transactional(propagation=Propagation.MANDATORY) //必须在一个已有的事务中
执行,否则 抛出异常
@Transactional(propagation=Propagation.NEVER) //必须在一个没有的事务中执
行, 否则抛出异常(与Propagation.MANDATORY相反)
@Transactional(propagation=Propagation.SUPPORTS) //如果其他bean调用这个方
法,在其 他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.
/*public void methodName(){
update();//本类的修改方法 1
otherBean.update();//调用其他类的修改方法
update();//本类的修改方法 2
}
other失败了不会影响 本类的修改提交成功
本类update的失败,other也失败
*/
@Transactional(propagation=Propagation.NESTED)
@Transactional (propagation =
Propagation.REQUIRED,readOnly=true) //readOnly=true只读,不能更新,删除
@Transactional (propagation = Propagation.REQUIRED,timeout=30)//设置超时时间
@Transactional (propagation =
Propagation.REQUIRED,isolation=Isolation.DEFAULT)//设置 数据库隔离级别
分享到:
相关推荐
Spring annotation 样例
Spring Annotation
spring annotation注解 使用Spring注解来注入属性
NULL 博文链接:https://cyhcheng.iteye.com/blog/390551
spring的Annotation注解.
Spring的Annotation配置相关讲义
详解 Spring 3.0 基于 Annotation 的依赖注入实现。。详解 Spring 3.0 基于 Annotation 的依赖注入实现。。
花了些时间做了一个实验,彻底弄懂了spring Annotation注入的方式。凡带有@Component,@Controller,@Service,@Repository 标志的等于告诉Spring这类将自动产生对象,而@Resource则等于XML配置中的ref,告诉spring此处...
Spring_Annotation_AOP
关于Spring annotation的详细介绍,包括 @Component,@Autowired 等,感觉还不错。
3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握基于XML和Annotation的声明式事务管理的使用。 二.实验内容 (1)使用Spring JDBC实现书店的购书过程,即有如下一个BookShopDao接口...
Spring+mybatis annotation形式 进行增删查改,使用maven容器,配置完整,自己运行多次无问题
NULL 博文链接:https://dolphin-ygj.iteye.com/blog/548314
SpringMVC Spring MyBatis 框架整合 Annotation Maven Project
Spring IOC Annotation 注入 学习实例
spring的annotation-driven配置事务管理器详解 (多数据源配置
spring annotation 从入门到精通
spring annotation 注解 maven 配套的源码
spring annotation example source code java maven