如何在多实例应用程序上处理TransactionScope?

时间:2018-04-07 08:38:17

标签: entity-framework entity-framework-5 transactionscope

我正在使用Entity Framework 5.0。我在阅读和更新时需要限制对行的访问。

我的应用程序运行在10台以上的机器上,当我使用TransactionScope时,有时其他机器上的其他应用程序(随机)转储,无法更新或读取该表中的数据。

我认为TransactionScope限制访问我的表,而其读取或更新以及其他更新或读取请求将被转储。

当一个应用程序没有执行TransactionScope操作时,如何处理来自其他应用程序的其他请求以更新或读取该表中的数据?

我该如何处理?

using (var myDB = new MyDBEntities())
{
    using (TransactionScope scope = new TransactionScope())
    {
        // read and update myDB object with some code in here
        // ...

        myDB.SaveChanges();
        scope.Complete();
    }
}

1 个答案:

答案 0 :(得分:1)

使用事务范围时,您可以保留另一个事务来选择/更新同一行。

此外,您可以使用名为READPAST的特殊表提示隐藏来自另一个事务的未提交数据。

示例:

会话1

BEGIN TRANSACTION
update users with (SERIALIZABLE) set name='test' where Id = 1    
-- COMMIT --not committed yet

会话2

select * from users where Id = 1 
--waits session1 to finish its job
--rows returns after commit

会议3

select * from users with (READPAST) where Id = 1 --returns 0 row

当您未提交事务时,其他会话无法读取或更新数据。当您在session1上提交事务时,session2将能够读取该行。

http://omerc.blogspot.com.tr/2010/04/transaction-and-locks-in-ms-sql-2008.html

https://technet.microsoft.com/en-us/library/jj856598(v=sql.110).aspx

https://www.codeproject.com/Articles/690136/All-About-TransactionScope

请注意,数据仍然可用于丢失更新。为了防止这种情况,您可以考虑使用乐观/悲观锁定。

https://logicalread.com/sql-server-concurrency-lost-updates-w01/#.WskuNNNuZ-U