加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2019-10-29 23:47:08 所属栏目:MySql教程 来源:佚名
导读:笔者文笔功力尚浅,如有不妥,请慷慨指出,必定感激不尽 学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性。 传播属性 传播属性定义的是当一个事务方法碰到
副标题[/!--empirenews.page--]

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

笔者文笔功力尚浅,如有不妥,请慷慨指出,必定感激不尽

学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性。

传播属性

传播属性定义的是当一个事务方法碰到另一个事务方法时的处理行为,一共有七种行为,定义如下

其实只看概念的话已经很直截了当了说明了每个传播性的作用,此时我们再用具体的例子演示一下每个传播性属性下的行为。

此次演示我们使用的是H2数据库,这个数据库是作用在内存里面的,所以对于我们演示事务效果来说正好,无需我们在进行其他的配置了,我们新建一个表。将下面语句放在schema.sql文件里面即可,SpringBoot程序在启动的时候就会自动为我们在内存里面建立这样的一个表。

  1. CREATE TABLE FOO (ID INT IDENTITY, BAR VARCHAR(64)); 

演示之前我们会定义两个类FooService和BarService。我们使用BarService 里面的方法进行调用FooService 中的方法。

环境准备

在进行事务演示之前,其实可以分为以下几种情况,根据排列组合,我们可以得出以下八种情况

  •  调用者:有无事务
  •  调用者:是否有异常
  •  被调用者:有无事务**(这个是通过传播属性进行控制的)**所以并不在排列组合中
  •  被调用者:是否有异常

异常类

其中的RollbackException是我们自己定义的一个异常类

  1. @Service  
  2. public class BarServiceImpl implements BarService{  
  3.     @Autowired  
  4.     private FooService fooService; 
  5.     // PROPAGATION_REQUIRED演示 无事务  
  6.     @Override  
  7.     public void testRequiredNoTransactional() throws RollbackException {  
  8.         fooService.testRequiredTransactional();  
  9.     }  

调用者

在BarService中定义两个方法,一个是带着事务的,一个是不带事务的

  1. // 有事务  
  2. @Override  
  3. @Transactional(rollbackFor = Exception.class)  
  4. public void hasTransactional() throws RollbackException {  
  5. }  
  6. // 无事务  
  7. @Override  
  8. public void noTransactional() throws RollbackException {  

接下来我们就根据俄上面定义的八种情况进行事务传播属性的学习。

PROPAGATION_REQUIRED

在此传播属性下,被调用方是否新建事务取决去调用者是否带着事务。

想要了解这个传播属性的特性,其实我们演示上面八种情况的两个例子就够了

  •  第一种情况我们在被调用者抛出异常的情况下,如果查询不到插入的数据,那么就说明被调用者在调用者没有事务的情况下自己新建了事务。
  •  第二种情况我们在调用者抛出异常的情况下,如果查询不到插入的数据,那么就说明被调用者在调用者有事务的情况下就加入当前事务了。

我们先来看一下被调用者的类的方法例子。

  1. @Service  
  2. public class FooServiceImpl implements FooService {  
  3.     @Autowired  
  4.     private JdbcTemplate jdbcTemplate;    
  5.     // REQUIRED传播属性-被调用者有异常抛出  
  6.     @Override  
  7.     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)  
  8.     public void testRequiredHasException() throws RollbackException {  
  9.         jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ("+Global.REQUIRED_HAS_EXCEPTION+")");  
  10.         throw new RollbackException();  
  11.     }  
  12.     // REQUIRED传播属性-被调用者无异常抛出  
  13.     @Override  
  14.     @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)  
  15.     public void testRequiredNoException() throws RollbackException {  
  16.         jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ("+Global.REQUIRED_NO_EXCEPTION+")");  
  17.     }  

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读