影响spring 事务失效的写法(下)

简介: 这篇主要介绍一些其他问题

大事务问题


在使用spring事务时,有个让人非常头疼的问题,就是大事务问题。


通常情况下,我们会在方法上@Transactional注解,填加事务功能,比如:


@Service
public class UserService {
    @Autowired 
    private RoleService roleService;
    @Transactional
    public void add(UserModel userModel) throws Exception {
       query1();
       query2();
       query3();
       roleService.save(userModel);
       update(userModel);
    }
}


@Service
public class RoleService {
    @Autowired 
    private RoleService roleService;
    @Transactional
    public void save(UserModel userModel) throws Exception {
       query4();
       query5();
       query6();
       saveData(userModel);
    }
}


但@Transactional注解,如果被加到方法上,有个缺点就是整个方法都包含在事务当中了。


上面的这个例子中,在UserService类中,其实只有这两行才需要事务:


roleService.save(userModel);
update(userModel);
在RoleService类中,只有这一行需要事务:
saveData(userModel);


现在的这种写法,会导致所有的query方法也被包含在同一个事务当中。


如果query方法非常多,调用层级很深,而且有部分查询方法比较耗时的话,会造成整个事务非常耗时,而从造成大事务问题。


编程式事务


上面聊的这些内容都是基于@Transactional注解的,主要说的是它的事务问题,我们把这种事务叫做:声明式事务。


其实,spring还提供了另外一种创建事务的方式,即通过手动编写代码实现的事务,我们把这种事务叫做:编程式事务。例如:


   @Autowired
   private TransactionTemplate transactionTemplate;
   ...
   public void save(final User user) {
         queryData1();
         queryData2();
         transactionTemplate.execute((status) => {
            addData1();
            updateData2();
            return Boolean.TRUE;


在spring中为了支持编程式事务,专门提供了一个类:TransactionTemplate,在它的execute方法中,就实现了事务的功能。


相较于@Transactional注解声明式事务,我更建议大家使用,基于TransactionTemplate的编程式事务。主要原因如下:


避免由于spring aop问题,导致事务失效的问题。

能够更小粒度的控制事务的范围,更直观。

建议在项目中少使用@Transactional注解开启事务。但并不是说一定不能用它,如果项目中有些业务逻辑比较简单,而且不经常变动,使用@Transactional注解开启事务开启事务也无妨,因为它更简单,开发效率更高,但是千万要小心事务失效的问题。


相关文章
|
Java 数据库连接 数据库
Spring事务监听,为什么会出现事务失效?
Spring 在 4.2 版本之后提供了@TransactionlEventListener 注解,可以很方便地在事务提交后做一些处理,但是如果使用不当,或者没有正确理解其背后的运行逻辑,很容易踩坑甚至导致线上故障。 之前工作中就遇到了一个问题,在事务监听时,做了一些事务操作,但是这个事务并没有生效。 今天我们就来深入了解一下,这个问题是怎么产生的,又该如何解决。
|
Java 数据库 Spring
Spring事务失效场景
如果@Transactional 没有特别指定,Spring 只会在遇到运行时异常RuntimeException或者error时进行回滚,而IOException等检查异常不会影响回滚。
431 0
Spring事务失效场景
|
Java 开发者 Spring
影响spring 事务失效的写法(中)
这篇介绍事务不回滚的问题
271 0
|
存储 缓存 Java
影响spring 事务失效的写法(上)
影响spring 事务失效的写法上篇,主要介绍事务不生效的问题
244 0
|
IDE Java 关系型数据库
干货!Spring里面@Transactional失效场景
【场景】明明使用Spring的AOP托管所有事务,在每个Service的函数中也加上了@Transactional注解,可依然还是出现数据不一致,事务不符合预期的情况呢?代码没报错,运行日志也无异常,怎么办呢?
381 0
干货!Spring里面@Transactional失效场景
|
Java Spring
Spring 自调用事务失效,你是怎么解决的?
相信大家都遇到一种事务失效场景,那就是 Spring 自调用,就是在 Service 方法内,调用另一个加 @Transactional 注解的方法,发现事务失效,这时候你是怎么解决的呢?
611 0
|
Java Spring
Spring事务失效的9种场景
Spring事务失效的9种场景
703 1
|
Java 开发者 Spring
聊聊spring事务失效的12种场景,太坑了(下)
聊聊spring事务失效的12种场景,太坑了
聊聊spring事务失效的12种场景,太坑了(下)
|
存储 缓存 Java
聊聊spring事务失效的12种场景,太坑了(上)
聊聊spring事务失效的12种场景,太坑了
聊聊spring事务失效的12种场景,太坑了(上)
|
缓存 NoSQL 前端开发
玩转Spring Cache --- 扩展缓存注解支持失效时间TTL【享学Spring】(下)
玩转Spring Cache --- 扩展缓存注解支持失效时间TTL【享学Spring】(下)
玩转Spring Cache --- 扩展缓存注解支持失效时间TTL【享学Spring】(下)