关于@transactional,runtimeexception和非runtimeexception
来源:7-3 商品类别批量添加后端开发
四条眉毛____
2020-11-25
老师好,有两个问题。
- 第一个是想询问我对@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回答
-
正确的哈,或者说中间计算过程中由于参数输入非法也有可能导致回滚,此外,值得注意的是,事务只支持数据库级别,像咱们中间操作了文件,是不支持文件的自动回滚的,因为Transactional复用的是底层数据库的事务。要回滚需要自己再Catch里面手工删除文件
不需要,直接抛出也能回滚的
其实可以指定成rollbackfor=exception即可回滚 https://www.cnblogs.com/clwydjgs/p/9317849.html
012020-11-26
相似问题