如何在后期回滚事务?

Zah*_*hid 1 .net c# asp.net sql-server-2008

我有一个数据输入ASP.NET应用程序.在一个完整的数据输入期间,发生许多交易.我想跟踪所有这些事务,以便如果用户想要放弃数据条目,我可以回滚我保持记录的所有事务.

SQL 2008,Framework版本是4.0,我使用的是c#.

Eri*_*sch 5

对于不熟悉Web开发的人来说,这总是一个艰难的教训.但这里是:

每个往返Web请求都是一个单独的独立执行线程

这意味着,简单地说,每次提交页面请求(单击按钮,导航到新页面,甚至刷新页面),它就可以在与前一个不同的线程上运行.更重要的是,即使您确实两次获得相同的线程,在您的两个请求之间的时间内,线程可能已经处理了几个其他Web请求.

这使得跨多个Web请求跨越简单事务实际上是不可能的.

这是您应该记住的另一个概念:

事务用于批处理操作,而不是交互操作.

这意味着事务是短暂的,并且包含顺序(或同时)执行的几个操作,其中所有操作都是原子操作,并且要么全部完成,要么全部失败.事务通常不是设计为长期的(意味着等待用户以交互方式决定各种操作).

Web应用程序不是桌面应用程序. 他们不像他们一样运作.当你做网络应用程序时,你必须改变你的想法.最重要的经验教训是,每个请求都是一个独立的执行单元.

现在,上面,我说"简单交易",也称为轻量级或本地交易.还有所谓的分布式事务,使用它们需要分布式事务协调器.MSDTC非常常用.然而,DT的表现要比LWT慢得多.此外,他们要求将基础设施设置为使用DTC.

可以使用DTC跨Web请求跨越事务.这是通过在分发事务中"登记",然后以某种方式在请求之间共享此事务标识符来完成的.但是这需要很多工作来设置和处理,并且有很多容易出错的情况.如果您有其他选择,这不是您想要做的事情.

通常,最好将数据添加到临时表或表中,然后在最终保存完成后,将该数据传输到永久表.另一种选择是维护某些状态(例如使用ViewState或Session)来跟踪更改.

一种流行的方法是使用JavaScript执行客户端操作,然后在完成后将所有更改提交到服务器.但是,如果您需要导航到不同的页面,这很难实现.