java 事务方法调用非事务函数会回滚吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 事务方法调用非事务函数会回滚吗相关的知识,希望对你有一定的参考价值。

你测试一下就晓得了, 会回滚, 我做了测试

@Override
@Transactional(rollbackFor = Exception.class)
public void test() 
    TbLog log = new TbLog();
    log.setId("3");
    log.setOperationContent("事物回滚测试:有回滚注解");
    tbLogService.create(log);
    test1();


private void test1()
    for (int i = 1; i <3 ; i++) 
        if (i==2)
            throw new RestClientException("事物回滚测试");
        
        TbLog log = new TbLog();
        log.setId(String.valueOf(i));
        log.setOperationContent("事物回滚测试:没注解");
        tbLogService.create(log);
    


下面这种配置了不回滚的类型就不会回滚
@Override
@Transactional(rollbackFor = Exception.class,noRollbackFor = RestClientException.class)
public void test() 
    TbLog log = new TbLog();
    log.setId("3");
    log.setOperationContent("事物回滚测试:有回滚注解");
    tbLogService.create(log);
    test1();


private void test1()
    for (int i = 1; i <3 ; i++) 
        if (i==2)
            throw new RestClientException("事物回滚测试");
        
        TbLog log = new TbLog();
        log.setId(String.valueOf(i));
        log.setOperationContent("事物回滚测试:没注解");
        tbLogService.create(log);
    

参考技术A 不会,但如果调用的是同一张表的话会卡死
因为开始事物的时候会锁表
然后调用非事物函数的话就会一直等待本回答被提问者采纳

如果在提交时抛出异常,C# TransactionScope 会回滚吗?

【中文标题】如果在提交时抛出异常,C# TransactionScope 会回滚吗?【英文标题】:Does C# TransactionScope rollback if an exception is thrown while committing? 【发布时间】:2021-08-10 12:43:34 【问题描述】:

根据微软文档:

TransactionScope.Complete 只是将您的状态通知事务管理器的一种方式,事务管理器提交事务的实际工作发生在 using 块中的最后一行代码之后。事务管理器根据是否调用了 TransactionScope.Complete 方法来决定提交或回滚。

那么,如果在提交事务的过程中出现异常(例如 Internet 关闭、数据库连接关闭)会发生什么?会回滚还是抛出 TransactionScope 异常?

using (TransactionScope transactionScope = new TransactionScope())

    WriteToCloudDatabase(input);
    WriteToCloudDatabase(input);    // I know it will rollback if exception thrown in here.
    transactionScope.Complete();
    // Will it rollback if exception thrown in here? (while committing transactions)

【问题讨论】:

这不是你想知道的吗? “事务管理器根据是否调用了 TransactionScope.Complete 方法来决定提交或回滚。” 从技术上讲,交易总是可以提交并向客户端发送确认,但客户端无法正确处理此确认。这将导致异常但不会回滚。例如,在使用 SQL Server 时,当服务器处理完 COMMIT TRANSACTION 命令时,事务被提交并被认为是成功的,即使连接应该断开。但是,事务是原子的和数据库一致的属性在所有情况下都得到了保留。 @Klamsi 我不确定如果在事务管理器决定提交之后抛出异常会发生什么。 看起来你可以很容易地测试不? @JeroenMostert 谢谢!这消除了我的大部分疑虑。 【参考方案1】:

在处理 TransactionScope 时。 如果 Complete 方法已被调用,事务管理器将提交事务。 如果在Complete方法调用后任何代码引发异常,因为Complete方法已经被调用,当transactionScope被释放时,事务管理器将提交事务。

如果事务管理器由于连接丢失而无法提交事务,则所有打开的事务都应由数据库自己回滚。

【讨论】:

【参考方案2】:

刚刚找到答案:会回滚并抛出TransactionException。

根据 Microsoft 文档,TransactionScope 通过调用 CommittableTransaction.Commit 方法提交事务。https://docs.microsoft.com/en-us/dotnet/framework/data/transactions/implementing-an-implicit-transaction-using-transaction-scope

让我们看看 CommittableTransaction.Commit 方法做了什么:

当调用此方法时,所有已注册参与事务的对象都会被轮询,并且可以独立地表明他们对提交或回滚事务的投票。如果任何参与者投票回滚事务,则该事务将被回滚,并且此方法会引发 TransactionException 异常。这是事务的正常情况,您的代码应捕获并处理此类异常。 微软文档:https://docs.microsoft.com/en-us/dotnet/api/system.transactions.committabletransaction.commit?view=net-5.0#System_Transactions_CommittableTransaction_Commit

try

    using (TransactionScope transactionScope = new TransactionScope())
    
        WriteToCloudDatabase(input);
        transactionScope.Complete();
    

catch (TransactionException)

    // If something wrong happens while committing the transaction, it will rollback and throw this exception.

catch (Exception)

    // If something wrong happens before committing the transaction, it will rollback and that exception will be caught in here.

【讨论】:

以上是关于java 事务方法调用非事务函数会回滚吗的主要内容,如果未能解决你的问题,请参考以下文章

如果外部事务范围未完成,内部事务范围会回滚吗?

PHP PDO 执行失败时事务会回滚吗?

这几个事务案例会回滚吗?最后一个90%的人判断错了...

这几个事务案例会回滚吗?最后一个90%的人判断错了...

这几个事务案例会回滚吗?最后一个90%的人判断错了...

什么是事务事务中的提交和回滚是什么意思