【问题标题】:What happens when SQL Transaction commit passes, but client timeouts/fails当 SQL 事务提交通过但客户端超时/失败时会发生什么
【发布时间】:2019-07-01 17:17:49
【问题描述】:

如果事务提交到数据库,SQL 的预期行为是什么,它成功写入数据库,但是客户端以某种方式失败(超时、网络问题)并且提交事务的最终信息永远不会到达客户。所以最终状态是:事务已提交,客户端超时或以某种不寻常的方式失败。这是否会使数据库处于客户端认为事务未提交的脏状态,或者 SQL 将确保如果此信息没有到达客户端,事务将被中止?

【问题讨论】:

    标签: sql transactions


    【解决方案1】:

    如果您在执行时没有明确提交它,它会回滚。至少对于 Oracle 数据库,我会想象其他 SQL 数据库会做同样的事情。

    如果您明确提交并执行它并且您的客户端程序在它返回结果之前崩溃或发生其他事情,那么它并不重要,因为它现在在数据库手中,而不是客户端计算机。您只需重新启动客户端程序并在那里查看查询结果。

    来源https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4010.htm https://docs.oracle.com/cd/B19306_01/server.102/b14220/transact.htm#CNCPT016

    【讨论】:

    • 如果“客户端”是一些服务,问题就更复杂了,所以必须确保事务已经完成。例如,如果服务正在对数据库中的某个值进行一些增量,并且它超时,我如何知道事务是完全完成还是回滚。例如,基于此服务必须做一些重试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多