请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于@transactional,runtimeexception和非runtimeexception

老师好,有两个问题。

  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回答

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

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

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

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信