【问题标题】:Multiple TransactionScope - fetches outdated information多个 TransactionScope - 获取过时的信息
【发布时间】:2012-04-17 17:23:52
【问题描述】:

这篇文章与我的这篇文章有些相关: How to synchronize database access in a WCF Service?

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

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

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

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

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

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

b.等待 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% 的时间内使用)...

【问题讨论】:

    标签: wcf transactionscope


    【解决方案1】:

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

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

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

    【讨论】:

    • 在您提供的链接中显示“默认情况下,System.Transactions 基础结构创建可序列化事务。”。这意味着“最高隔离级别 Serializable 提供了针对中断事务的高度保护,但要求每个事务在允许任何其他事务对数据进行操作之前完成。”但这不是我看到的行为。确实 - 'Function 2' 停止并等待'Function 1' 完成,但它实际读取的数据是'Function 1' 更改之前的数据!它应该显示一组新数据!
    • 更新:我现在看到我忘了做'transaction.Complete();'。愚蠢的我...... :)我现在看到只用事务范围包装'功能1'就足够了,这使得'功能2'获得正确的信息(它一直等到功能1完成)即使'功能2 ' 没有事务范围!这很棒 !你能告诉我这是为什么吗?如果我从 2 个不同的客户端调用“功能 2”会怎样?当“功能 1”完成时,哪个会先触发?先到先得?
    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2020-06-30
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多