关于@transactional,runtimeexception和非runtimeexception

来源:7-3 商品类别批量添加后端开发

四条眉毛____

2020-11-25

老师好,有两个问题。

  1. 第一个是想询问我对@transactional的理解是不是到位,我理解的@transactional是为了保证事务的原子性,比如说有这样的一个操作
@Transactional
public afunction()
{
向数据库插入一条记录
...
程序员手误,程序运行到这里会有runtime exception,比如说不小心打了一个1/0;
...
在数据库中删除一条记录
}

本来已经执行了”向数据库插入一条记录“,因为0/1出现了runtime exception,”在数据库中删除一条记录“就没办法执行,@Transaction保证了事务回滚,要么插和删都执行,要么都不执行。
2. 假如程序中有1/0这样的错误,程序中是必须捕获RuntimeException,也就是必须要有catch(RuntimeException e),catch(RuntimeException子类 e)才能让事务回滚吗。
3. 假如有这样的一个操作:

@Transactional
public afunction()
{
向数据库插入一条记录
...
...
在数据库中删除一条记录
}

因为在”在数据库中删除一条记录“这一函数体中SQL语句写错了而报错,那这好像是一个非RuntimeException?是一个SQLexception?那这样是不会回滚的吗?会执行了插入但不执行删除吗?

写回答

1回答

翔仔

2020-11-25

  1. 正确的哈,或者说中间计算过程中由于参数输入非法也有可能导致回滚,此外,值得注意的是,事务只支持数据库级别,像咱们中间操作了文件,是不支持文件的自动回滚的,因为Transactional复用的是底层数据库的事务。要回滚需要自己再Catch里面手工删除文件

  2. 不需要,直接抛出也能回滚的

  3. 其实可以指定成rollbackfor=exception即可回滚 https://www.cnblogs.com/clwydjgs/p/9317849.html

0
1
四条眉毛____
非常感谢!
2020-11-26
共1条回复

Java双版本(SSM到SpringBoot)校园商铺全栈开发

SSM商铺V1.0,解决毕设痛点;SpringBoot商铺V2.0,满足工作刚需

5113 学习 · 8144 问题

查看课程