设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 数据 创业者 手机
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Spring事务传播属性有那么难吗?看这一篇就够了(2)

发布时间:2019-10-25 22:43 所属栏目:115 来源:佚名
导读:接下来我们看一下调用者方法的例子 @Service publicclassBarServiceImplimplementsBarService{ @Autowired privateFooServicefooService; //有事务 @Override @Transactional(rollbackFor=Exception.class) publicv

接下来我们看一下调用者方法的例子

  1. @Service  
  2. public class BarServiceImpl implements BarService{  
  3.     @Autowired  
  4.     private FooService fooService;  
  5.     // 有事务  
  6.     @Override  
  7.     @Transactional(rollbackFor = Exception.class)  
  8.     public void hasTransactional() throws RollbackException {  
  9.         // 调用者有事务,抛异常  被调用者无异常  
  10.         fooService.testRequiredNoException();  
  11.         throw new RollbackException();  
  12.     }  
  13.     // 无事务  
  14.     @Override  
  15.     public void noTransactional() throws RollbackException {  
  16.         // 调用者无事务,不抛异常  被调用者有异常  
  17.         fooService.testRequiredHasException();  
  18.     }  

此时我们在程序调用时进行查询

  1. String noException = Global.REQUIRED_NO_EXCEPTION;  
  2. String hasException = Global.REQUIRED_HAS_EXCEPTION;   
  3. try {  
  4.     barService.noTransactional();  
  5. }catch (Exception e){  
  6.     log.info("第一种情况 {}",  
  7.             jdbcTemplate  
  8.                     .queryForObject("SELECT COUNT(*) FROM FOO WHERE BAR='"+hasException+"'", Long.class));  
  9. }  
  10. try {  
  11.     barService.hasTransactional();  
  12. }catch (Exception e){  
  13.     log.info("第二种情况 {}",  
  14.             jdbcTemplate  
  15.                     .queryForObject("SELECT COUNT(*) FROM FOO WHERE BAR='"+noException+"'", Long.class));  

查看打印出来的日志

  1. 2019-10-16 13:02:04.142  INFO 11869 --- [           main] c.e.t.t.TransactionApplication           : 第一种情况 0  
  2. 2019-10-16 13:02:04.143  INFO 11869 --- [           main] c.e.t.t.TransactionApplication           : 第二种情况 0 

我们看到我们都没有查到相应的数据,说明数据都回滚了。此时我们应该就理解了那句话支持当前事务,如果没有就新建事务。

PROPAGATION_SUPPORTS

被调用者是否有事务,完全依赖于调用者,调用者有事务则有事务,调用者没事务则没事务。

接下来我们还是用上面的两个例子进行演示

  •  第一种情况:被调用者抛出异常的情况下,如果仍能查询到数据,说明事务没有回滚,说明被调用者没有事务
  •  第二种情况:调用者抛出异常情况下,如果查不到数据,说明两个方法在一个事务中

接下来仍然是例子演示

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读