此传播属性下,无论调用者是否有事务,被调用者都会新建一个事务
- 第一种情况:调用者无事务,被调用者会新建事务,所以查不到数据
- 第二种情况:调用者有事务,被调用者会新建一个事务,所以调用者抛异常影响不到被调用者,所以能查到数据
接下来我们演示代码。
被调用者
- // REQUIRES_NEW传播属性-被调用者有异常抛出
- @Override
- @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
- public void testRequiresNewHasException() throws RollbackException {
- jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.REQUIRES_NEW_HAS_EXCEPTION+"')");
- throw new RollbackException();
- }
- // REQUIRES_NEW传播属性-被调用者无异常抛出
- @Override
- @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
- public void testRequiresNewNoException() throws RollbackException {
- jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.REQUIRES_NEW_NO_EXCEPTION+"')");
- }
调用者的例子和上面的相同,我们直接来看执行情况
- 2019-10-16 16:29:20.296 INFO 15553 --- [ main] c.e.t.t.TransactionApplication : 第一种情况 0
- 2019-10-16 16:29:20.298 INFO 15553 --- [ main] c.e.t.t.TransactionApplication : 第二种情况 1
我们发现和我们的推论是一样的,说明调用者的事务和被调用者的事务完全无关。此时我们应该就理解这句话了无论当前是否有事务,都会新起一个事务。
PROPAGATION_NOT_SUPPORTED
无论调用者是否有事务,被调用者都不以事务的方法运行
同样是这两个例子
- 第一种情况:被调用者都不会有事务,那么在抛异常之后就能查到相应的数据
- 第二种情况:在调用者有事务的情况下,被调用者也会在无事务环境下运行,所以我们依然能查到数据
接下来验证我们的猜测
- // NOT_SUPPORTED传播属性-被调用者有异常抛出
- @Override
- @Transactional(rollbackFor = Exception.class,propagation = Propagation.NOT_SUPPORTED)
- public void testNotSupportHasException() throws RollbackException {
- jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NOT_SUPPORTS_HAS_EXCEPTION+"')");
- throw new RollbackException();
- }
- // NOT_SUPPORTED传播属性-被调用者无异常抛出
- @Override
- @Transactional(rollbackFor = Exception.class,propagation = Propagation.NOT_SUPPORTED)
- public void testNotSupportNoException() throws RollbackException {
- jdbcTemplate.execute("INSERT INTO FOO (BAR) VALUES ('"+Global.NOT_SUPPORTS_NO_EXCEPTION+"')");
- }
然后查看执行结果
- 2019-10-16 16:38:35.065 INFO 15739 --- [ main] c.e.t.t.TransactionApplication : 第一种情况 1
- 2019-10-16 16:38:35.067 INFO 15739 --- [ main] c.e.t.t.TransactionApplication : 第二种情况 1
我们可以看到在最后两种情况都查到了数据,根据演示效果应该可以理解这句话了,不支持事务,如果当前存在事务,就将此事务挂起不以事务方式运行。
PROPAGATION_NEVER
调用者有事务,被调用者就会抛出异常
这个就不演示,相信大家看到这里应该都会明白在第一种情况下我们是能够查到数据的。在第二种情况下由于调用者带着事务,所以会抛异常。
PROPAGATION_NESTED
此传播属性下,被调用者的事务是调用者的事务的子集。
我们重点说一下NESTED的传播属性的特性 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|