0

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

我得到的回答过于复杂和\或矛盾...... :(

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

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

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

function1在服务上生成一个函数:

一个。将特定行从“Charlie”更改为“Chin”

湾。等待 5 秒

C。再次将行从“Chin”更改为“Carol”

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

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

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

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

我究竟做错了什么 ?

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

4

1 回答 1

0

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

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

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

于 2012-04-17T18:15:58.407 回答