gpt4 book ai didi

c# - IDbTransaction.Commit 在事务完成前返回

转载 作者:行者123 更新时间:2023-12-04 08:38:50 24 4
gpt4 key购买 nike

我有一个服务器(很少)动态创建数据库行以适应用户配置的数据模型。在启动期间,服务器可能必须创建大约一千行以及对现有表的多个插入。
完成所有这些后,它会提交事务并向可能正在监听的任何人发送有关新数据模型的通知。问题是,transaction.Commit() 似乎在数据库实际完成更改之前返回,因此如果客户端在发送通知后向服务器发出请求,客户端可能会得到一个空结果。我的假设是等待 transaction.Commit() 将确保事务全部完成并提交。
客户端得到空结果的原因是数据库在不做 DDL 操作时使用快照隔离,所以很明显快照是在 DDL 操作完成之前拍摄的(但在 transaction.commit 返回之后)
操作顺序为:

  • 开始交易
  • 在数据库 (DDL) 中执行数千次操作
  • 提交交易
  • 发送有关更改的通知
  • 客户端请求数据(快照隔离)
  • 没有数据(交易前的状态)返回给客户端。

  • 为什么 transaction.Commit() 在事务完成提交之前完成?如何让服务器在继续发送通知之前等待事务完全完成?
    编辑:清晰。

    最佳答案

    正如我们在评论中发现的那样,一个可能的原因是未决的外部事务。如 documentation 中所述:

    When used in nested transactions, commits of the inner transactionsdon't free resources or make their modifications permanent. The datamodifications are made permanent and resources freed only when theouter transaction is committed. Each COMMIT TRANSACTION issued when@@TRANCOUNT is greater than one simply decrements @@TRANCOUNT by 1.When @@TRANCOUNT is finally decremented to 0, the entire outertransaction is committed. Because transaction_name is ignored by theDatabase Engine, issuing a COMMIT TRANSACTION referencing the name ofan outer transaction when there are outstanding inner transactionsonly decrements @@TRANCOUNT by 1.


    所以尽管 Commit()成功执行,如果存在外部事务 - 在该外部事务也提交之前,不会将任何更改持久化到数据库中。

    关于c# - IDbTransaction.Commit 在事务完成前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64659065/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com