如何将非数据库操作封装到事务中?
例如,假设我有一些顺序调用的方法/函数,一些更新数据库,一些文件系统更新文件,HttpSession中的一些更新参数,一些更新缓存等.如果后一个失败,比如更新会话,如何在文件系统,数据库等中回滚所有其他更改?
环境是像Tomcat这样的Java Servlet容器,类似于Struts2,任何RDBMS,像Hibernate或Ibatis这样的持久层等.
我读过有关的TransactionScope和这个文章,但我还是不明白两两件事:
SqlCommand.ExecuteNonQuery
执行它直到scope.Complete()
被调用才真正执行?如果这是真的,那么在范围内执行的所有操作都会保留并等待scope.Complete()
或scope.Rollback()
?TransactionScope
实例化它如何阻止SqlCommand.ExecuteNonQuery
执行并等待scope.Complete()
或scope.Rollback()
?它是否会创建一些"地方"并SqlCommand
以某种方式了解它并将指令放在那里?我需要执行几个需要“事务处理”的方法调用,但是除了try / catch / finally外,我不确定如何实现此方法。
背景
我想弄清楚的是
我想确保当请求注销时,我想确保整个过程要么全部成功,要么根本没有成功。例如,我不希望清理数据库,清理会话ID和注销操作失败(因此登录仍然有效)。
理想情况下,解决方案将在发生故障时“回滚”,从而确保维持先前的状态。
是否有一种巧妙的方法可以完成此操作,还是我受困于一系列嵌套的try / catch / finally块来执行此操作?