Sql server 2008 sql transactionscope行级锁定
关于在SQL Server(确切地说是SQL Azure)中锁定作用域的问题 情景 使用select语句选择一组记录。 我们翻阅记录 每个记录在transactionscope内更新- (每条记录彼此独立,不需要表锁) 我是否正确地假设上述操作将导致仅对该特定记录行的行级锁定 在一个具体例子的背景下提出问题。 在下面的示例中,itemsToMove中的每个项目是否一次锁定一个Sql server 2008 sql transactionscope行级锁定,sql-server-2008,entity-framework,azure-sql-database,transactionscope,Sql Server 2008,Entity Framework,Azure Sql Database,Transactionscope,关于在SQL Server(确切地说是SQL Azure)中锁定作用域的问题 情景 使用select语句选择一组记录。 我们翻阅记录 每个记录在transactionscope内更新- (每条记录彼此独立,不需要表锁) 我是否正确地假设上述操作将导致仅对该特定记录行的行级锁定 在一个具体例子的背景下提出问题。 在下面的示例中,itemsToMove中的每个项目是否一次锁定一个 var itemsToMove = ObjectContext.Where(emp => emp.Expirat
var itemsToMove = ObjectContext.Where(emp => emp.ExpirationDate < DateTime.Now)
foreach(Item expiredItem in itemsToMove)
{
bool tSuccess = false;
using (TransactionScope transaction = new TransactionScope())
{
try
{
//We push this to another table. In this case Azure Storage.
bool bSuccess = PushToBackup();
if(bSuccess)
{
ObjectContext.DeleteObject(expiredItem);
}
else
{
//throw an exception or return
return false;
}
ObjectContext.SaveChanges();
transaction.Complete();
tSuccess = true;
}
catch (Exception e)
{
return cResults;
}
}
}
if (tSuccess)
{
ObjectContext.AcceptAllChanges();
}
var itemsToMove=ObjectContext.Where(emp=>emp.ExpirationDate
如果没有任何外部/包装器事务调用您的代码,则对transaction.Complete()的每次调用都应提交并释放所有锁
只是几个简短的警告
- SQL不一定默认为行级锁定-它可以使用(但建议您将SQL留给自己的设备)
- 请注意,新TransactionScope()的默认隔离级别为。对于您的场景来说,这可能过于悲观