该应用程序的架构是直截了当的。有一个Web应用程序维护帐户持有人数据。处理此数据并根据业务规则的数量更新帐户持有者的状态。此过程使用页面上的按钮启动,并且是一个长时间运行的过程(比如15分钟)。开发一个组件来执行此数据处理,该数据处理在内部调用存储过程。大多数业务规则都保存在存储过程中。
为了处理超时,处理是异步完成的(使用线程池或自定义线程或异步回调代理)。整个过程在一个交易下运行。如果应用程序池被回收或者工作进程被强制终止,我想知道您对事务发生了什么的看法?
答案 0 :(得分:10)
我假设您正在使用SQL Server,MySQL或Oracle等SQL数据库。
这些数据库平台有自己的内部事务模型。当您与他们通信并启动事务时,服务器会为您管理事务。
对于要提交的事务,客户端必须告知数据库提交更改。如果事务从未收到此指令,则事务仍处于“挂起”状态。最终,在事务处于“待定”状态而没有任何进一步指示之后,服务器将认为它“已死”并将放弃它,对事务执行回滚。
这是事务处理的最坏情况,因为挂起的事务可能(取决于隔离级别)导致数据库中的资源(行,页,整个表)不可用。通常,当网络连接在事务中间失败(例如断电)时,您会看到此情况,并且客户端不会向服务器发送“关闭连接”命令。
如果您的应用程序在交易期间在处理数据库的过程中回收应用程序池而终止,则将关闭与数据库的连接。这种关闭连接的行为应该导致服务器放弃与该连接关联的任何待处理事务。
确切的行为取决于具体的数据库和配置。
在任何一种情况下,您的数据库数据都将保持不变。
答案 1 :(得分:0)
如果工作进程终止,我认为应用程序回滚。
但你必须测试。