多事务范围 - 获取过时的信息



这篇文章与我的这篇文章有些关系: 如何在 WCF 服务中同步数据库访问?

我在那里得到的回应过于复杂和\或矛盾......:(

我创建了一个示例 WCF 服务,并针对它运行 3 个客户端实例。该服务与名为名称的 SQL 表通信,该表具有多行。

一个客户端在服务中生成函数 1

第二个客户端在服务中生成函数 2

函数

1 在服务上生成一个函数,该函数:

a. 将特定行从"Charlie"更改为"Chin"

B. 等待 5 秒

c. 再次将行从"Chin"更改为"Carol"

函数

2 生成一个返回所有名称列表的函数。

需要注意的是,服务中的两个函数都用"TransactionScope"包装。

做什么:我运行函数 1(将"Charlie"更改为"Chin"并等待 5 秒),然后立即生成函数 2,它试图获取名称列表但挂起(因为函数 1 尚未完成),几秒钟后函数 1 将名称从"Chin"更改为"Carol",然后才释放函数 2 并返回名称列表。

事情是 - 从 function2 返回的名称列表不包含"Carol"!它包含"查理"!这是为什么呢?我认为这是因为函数 2 挂起直到函数 1 完成 - 它也会在函数 1 完成时才获取数据,但显然情况并非如此。

我做错了什么?

不想开始使用锁,因为这会减慢整个系统的速度。在我的最终服务中,我将有大约 20 种方法,我不希望所有这些方法都必须使用锁......(只有 3-4 种方法用于"阅读",但它们是 95% 时间都会使用的方法)......

为此,

您需要锁定正在更改的数据,以便另一个进程在第一个进程完成之前无法读取数据。

您可以使用事务范围来执行此操作。将隔离级别设置为可序列化。这将锁定数据。您可能必须指定读取还更新数据(到相同的值)以使第二个调用等待。

http://msdn.microsoft.com/en-us/library/system.transactions.isolationlevel(v=vs.90).aspx

最新更新