记一次springboot事务问题

场景描述:
由于业务需求,要在定时任务中做数据统计,任务执行清空表,然后将聚合数据重新插入数据库的操作。
技术背景:
1.springboot中开启shedule
2.controller中加Transactional注解
3.service中加Transactional注解
遇到问题:
1.事务没有生效
2.数据没有回滚
(额,第一个问题是try catch了异常,看似没有生效实际是生效的。不讲了,略过… 狗头.jpg)

情形1:

在controller中加事务,service也加事务,比较truncate和delete

在这里插入图片描述

truncate执行:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
结果显示事务没有生效(原因看最后解释)。

delete执行

开始执行之前数据库数据如下:
在这里插入图片描述
执行delete
在这里插入图片描述
执行delete后数据库
在这里插入图片描述
这里可以看到数据库事务没有提交。
抛出异常
在这里插入图片描述
抛出异常后看一下数据库数据,依然没变。
在这里插入图片描述
结果显示事务生效,满足需求。

情形2,在controller中加事务,service不加事务

在这里插入图片描述
执行delete操作
在这里插入图片描述
此时数据库数据没变:
在这里插入图片描述
执行完毕后数据库也是如此,不再赘述,复合预期。

truncate操作同情形1的相同,也是不生效。

情形3,在service中加事务,service执行业务操作

controller代码如下
在这里插入图片描述

在这里插入图片描述
这里也是模拟了truncate和delete的操作,结果同controller中加事务并无不同,都是:
deleteTable执行了事务回滚,truncateTable没有回滚。

解释:
delete 语句是数据库操作语言(dml),这个操作会放到 rollback segement 中,事务提交之后才生效。如果有相应的 trigger,执行的时候将被触发。
truncate、drop 是数据库定义语言(ddl),操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值