如何处理多实例应用程序上的 TransactionScope?
How to handle TransactionScope on multi-instance applications?
我正在使用 Entity Framework 5.0。我需要在读取和更新某行时限制对它的访问。
我的应用程序 运行 在超过 10 台机器上使用,当我使用 TransactionScope 时,有时其他机器上的其他应用程序(随机)转储并且无法更新或读取数据 table。
我认为 TransactionScope 限制了对我的 table 的访问,而它的读取或更新以及其他更新或读取请求将转储。
当一个应用程序未执行 TransactionScope 操作时,如何处理来自其他应用程序的其他请求以更新或读取来自 table 的数据?
我该如何处理?
using (var myDB = new MyDBEntities())
{
using (TransactionScope scope = new TransactionScope())
{
// read and update myDB object with some code in here
// ...
myDB.SaveChanges();
scope.Complete();
}
}
使用事务范围时,您可以将另一个事务保存到 select/update 同一行。
此外,您可以使用称为 READPAST 的特殊 table 提示从另一个事务中隐藏未提交的数据。
示例:
会话 1
BEGIN TRANSACTION
update users with (SERIALIZABLE) set name='test' where Id = 1
-- COMMIT --not committed yet
session2
select * from users where Id = 1
--waits session1 to finish its job
--rows returns after commit
session3
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
请注意,数据仍然容易丢失更新。为了防止它,您可以考虑使用 optimistic/pessimistic 锁定。
https://logicalread.com/sql-server-concurrency-lost-updates-w01/#.WskuNNNuZ-U
我正在使用 Entity Framework 5.0。我需要在读取和更新某行时限制对它的访问。
我的应用程序 运行 在超过 10 台机器上使用,当我使用 TransactionScope 时,有时其他机器上的其他应用程序(随机)转储并且无法更新或读取数据 table。
我认为 TransactionScope 限制了对我的 table 的访问,而它的读取或更新以及其他更新或读取请求将转储。
当一个应用程序未执行 TransactionScope 操作时,如何处理来自其他应用程序的其他请求以更新或读取来自 table 的数据?
我该如何处理?
using (var myDB = new MyDBEntities())
{
using (TransactionScope scope = new TransactionScope())
{
// read and update myDB object with some code in here
// ...
myDB.SaveChanges();
scope.Complete();
}
}
使用事务范围时,您可以将另一个事务保存到 select/update 同一行。
此外,您可以使用称为 READPAST 的特殊 table 提示从另一个事务中隐藏未提交的数据。
示例:
会话 1
BEGIN TRANSACTION
update users with (SERIALIZABLE) set name='test' where Id = 1
-- COMMIT --not committed yet
session2
select * from users where Id = 1
--waits session1 to finish its job
--rows returns after commit
session3
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
请注意,数据仍然容易丢失更新。为了防止它,您可以考虑使用 optimistic/pessimistic 锁定。
https://logicalread.com/sql-server-concurrency-lost-updates-w01/#.WskuNNNuZ-U