oracle 提交事务后为啥不能撤销或回滚,不是有撤销段吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 提交事务后为啥不能撤销或回滚,不是有撤销段吗相关的知识,希望对你有一定的参考价值。

参考技术A commit事物以后,不能用rollback回滚 如果要找回的话 可以用闪回 参考技术B 因为要保持数据一致性,要回滚的话,有闪回 参考技术C 提交后,可以使用oracle的闪回功能
闪回功能有:闪回表、闪回事务、闪回数据库等本回答被提问者采纳

知识点:Spring嵌套事务方式

Spring遇到嵌套事务时,怎么实现

实验时却遇到一个奇怪的问题:


1、当ServiceA.a()方法调用ServiceB.b()方法时,内层事务提交和回滚,都不受外层事务提交或回滚的影响。


2、当ServiceA.a()方法调用ServiceA.c()方法时,内层事务不能正确地提交或回滚。

 

如下:

xxxServiceA类中,有如下两个方法。

 

@Transactional 
method_One() {
    method_Two();
}


@Transactional(propagation = Propagation.REQUIRES_NEW) 
method_Two(){
    //do something
}

 

没有找到类似creating new transaction的输出,同一个Service类中,spring并不重新创建新事务,如果是两不同的Service,就会创建新事务了。

 

xxxServiceA类:

@Transactional 
method_One() {
    method_Two();
}

xxxServiceB类:

@Transactional(propagation = Propagation.REQUIRES_NEW) 
method_Two(){
    //do something
}

Propagation.REQUIRES_NEW生效创建了一个新事务

 

让事务起作用,遇到错误进行回滚,应该注意的事项

第一种情况:同一个类中 一个方法无嵌套方法

如果方法名上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException()。否则事务不起作用。


第二种情况:同一个类中 方法A嵌套方法B
方法A有@Transactional,方法内都没有try catch,事务起作用。
方法A有@Transactional和try catch,并且catch中用throw new RuntimeException(),事务起作用。


第三种情况:不同类中方法C嵌套方法B
方法B上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException()。否则方法B的事务不起作用。
方法C上加上@Transactional注解,方法内不要用try catch ;如果必须要用try catch ,则catch中必须用throw new RuntimeException(),此时方法B怎么写都行。否则方法C的事务不起作用。

 

 

文章转载至:https://blog.csdn.net/m0_37701381/article/details/85066711

以上是关于oracle 提交事务后为啥不能撤销或回滚,不是有撤销段吗的主要内容,如果未能解决你的问题,请参考以下文章

切分大任务成多个子任务(事务),汇总后统一提交或回滚

如何知道何时提交或回滚事务

Oracle的自治事务

Access 2007 表单错误:您尝试提交或回滚事务

mysql事务未commit

请问oracle commit以后还能再回滚吗,rollback必须写在commit之前吗