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

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

发布时间:2019-10-25 22:43 所属栏目:115 来源:佚名
导读:被调用者,只是将@Transactional 注解中的propagation 属性更换为了Propagation.SUPPORTS //SUPPORTS传播属性-被调用者有异常抛出 @Override @Transactional(rollbackFor=Exception.class,propagation=Propagation.

被调用者,只是将@Transactional 注解中的propagation 属性更换为了Propagation.SUPPORTS

  1. // SUPPORTS传播属性-被调用者有异常抛出  
  2. @Override  
  3. @Transactional(rollbackFor = Exception.class,propagation = Propagation.SUPPORTS)  
  4. public void testSupportsHasException() throws RollbackException {  
  5.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.SUPPORTS_HAS_EXCEPTION+"')");  
  6.     throw new RollbackException();  
  7. }  
  8. // SUPPORTS传播属性-被调用者无异常抛出  
  9. @Override  
  10. @Transactional(rollbackFor = Exception.class,propagation = Propagation.SUPPORTS)  
  11. public void testSupportsNoException() throws RollbackException {  
  12.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.SUPPORTS_NO_EXCEPTION+"')");  

调用者和上面的例子调用一样,我们直接查看执行效果

  1. 2019-10-16 13:50:27.738  INFO 12174 --- [           main] c.e.t.t.TransactionApplication           : 第一种情况 1  
  2. 2019-10-16 13:50:27.741  INFO 12174 --- [           main] c.e.t.t.TransactionApplication           : 第二种情况 0 

我们看到了在第一种情况下查到了数据,说明在第一种情况下被调用者是没有事务的。此时我们应该就理解了这句话 支持当前事务,如果没有就不以事务的方式运行。

PROPAGATION_MANDATORY

依然是这两个例子进行演示

  •  第一种情况:因为调用者没有事务,所以此传播属性下应该是抛异常的
  •  第二种情况:被调用者的事务和调用者事务是同样的

接下来是被调用者的代码例子

  1. // MANDATORY传播属性-被调用者有异常抛出  
  2. @Override  
  3. @Transactional(rollbackFor = Exception.class,propagation = Propagation.MANDATORY)  
  4. public void testMandatoryHasException() throws RollbackException {  
  5.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.SUPPORTS_HAS_EXCEPTION+"')");  
  6.     throw new RollbackException();  
  7. }  
  8. // MANDATORY传播属性-被调用者无异常抛出  
  9. @Override  
  10. @Transactional(rollbackFor = Exception.class,propagation = Propagation.MANDATORY)  
  11. public void testMandatoryNoException() throws RollbackException {  
  12.     jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.SUPPORTS_NO_EXCEPTION+"')");  

调用者和上面的例子调用一样,我们直接查看执行效果

  1. 2019-10-16 13:58:39.178 ERROR 12317 --- [           main] c.e.t.t.TransactionApplication           : org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory' 
  2. 2019-10-16 13:58:39.276  INFO 12317 --- [           main] c.e.t.t.TransactionApplication           : 第一种情况 0 
  3. 2019-10-16 13:58:39.281  INFO 12317 --- [           main] c.e.t.t.TransactionApplication           : 第二种情况 0 

我们发现和我们推测一样,说明被调用者是不会自己新建事务的,此时我们应该就理解了这句话支持当前事务,如果当前没事务就抛异常。

PROPAGATION_REQUIRES_NEW

(编辑:ASP站长网)

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