有一次和人谈起关于事务的话题,谈到怎样的资源才能事务型资源。除了我们经常使用的数据库、消息队列、事务型文件系统(TxF)以及事务性注册表(TxR)等,还有那些资源直接可以纳入事务进行状态的管理呢?我说如果我们按照.NET事务模型的规范对相应的资源进行合理的封装,原则上我们可以让任何可编程的资源成为事务型资源。本篇文章中,我将通过简单的编程将一个普通的变量变成支持事务,让变量的值也可以回滚,以确保事务前后的数据一致性。
本文中所说的事务型变量指的是这样的变量:
- 在事务开始前,变量的初始值会被保存;
- 在事务中对变量的赋值只有在事务被成功提交后才会真正赋值给变量;
- 如果事务中止导致回滚,变量的值将会恢复到事务开始之前的状态。
上面的对事务型变量的描述可以通过下面的程序来体现:变量v在初始化时被赋值为1。然后通过TransactionScope开始一个事务,并将变量纳入该事务之中。在事务范围内将值赋值为2,然后调用DoSomething方法,并提交事务。如果DoSomething执行过程中抛出异常,整个事务将会回滚。当整个事务中止回滚后,变量v的值回复到事务开始之前的状态,即值为1。
string[] args)
2: {
int>(1);
try
5: {
new TransactionScope())
7: {
8: Transaction.Current.EnlistPromotableSinglePhase(v);
9: v.Value = 2;
10: DoSomething();
11: transactionScope.Complete();
12: }
13: }
catch
15: { }
16: Debug.Assert(v.Value == 1);
17: }