【问题标题】:What happens to a transaction when App Pool recycles or the worker process is terminated forcefully?当 App Pool 回收或 worker 进程被强制终止时,事务会发生什么?
【发布时间】:2011-02-07 09:15:56
【问题描述】:

应用程序的架构是直截了当的。有一个维护帐户持有人数据的 Web 应用程序。处理此数据并根据业务规则的数量更新帐户持有人的状态。此过程使用页面上的按钮启动,并且是一个长时间运行的过程(例如 15 分钟)。开发了一个组件来执行此数据处理,该组件在内部调用存储过程。大多数业务规则都保存在存储过程中。

为了处理超时,处理是异步完成的(使用线程池或自定义线程或异步回调委托)。整个过程在一个事务下运行。我想知道你对如果应用池被回收或工作进程被强制终止,事务会发生什么的看法?

【问题讨论】:

    标签: asp.net asynchronous application-pool


    【解决方案1】:

    我假设您使用的是 SQL 数据库,如 SQL Server、MySQL 或 Oracle。

    这些数据库平台有自己的内部事务模型。当您与他们通信并发起交易时,服务器会为您管理交易。

    对于要提交的事务,客户端必须告知数据库提交更改。如果交易从未收到此指令,则交易保持在“待处理”状态。最终,当事务“挂起”而没有任何进一步的指令后,服务器将认为它“死”并放弃它,对事务执行回滚。

    这是事务处理的最坏情况,因为挂起的事务可能(取决于隔离级别)导致数据库中的资源(行、页面、整个表)不可用。通常,当网络连接在事务中失败(例如,由于断电)并且客户端没有向服务器发送“关闭连接”命令时,您会看到这种情况。


    如果您的应用程序在事务期间对数据库进行处理时通过回收应用程序池而终止,与数据库的连接将关闭。这种关闭连接的行为应该导致服务器放弃与连接相关的任何未决事务。

    具体行为取决于具体的数据库和配置。

    在任何一种情况下,您的数据库数据都将保持不变。

    【讨论】:

    • 没错!我就是这么说的!!
    • 这就是我要寻找的简单直接的解释。
    【解决方案2】:

    如果工作进程终止,我认为应用程序回滚。

    但你必须测试。

    【讨论】:

    • 如果没有人执行提交,最终会超时,RDBMS 将回滚。我犯了一个错误,我写了“应用程序回滚”,但我应该写“事务回滚”
    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 2018-09-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2015-11-25
    • 1970-01-01
    相关资源
    最近更新 更多