2012-09-13 23 views
0

我从生产系统有一个奇怪的问题。我已经阅读使用no_lock进行读操作定义的已提交事务,并在同一范围内使用表锁进行写操作。阅读提交,没有锁。搞砸

但是,多个进程能够覆盖锁定并且能够执行写入操作,并且具有很大的影响。请帮忙!。谢谢。

using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions() { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted })) 
{ 
    dataAccess.ExecNonQuery("GetNextOrder", parametersList); //read orders from table 1, there is NO_lock in the SP 

    orderIDParameter = (IParameter)parametersList[0]; 
    int orderIDParameterValue = (int) orderIDParameter.Value; 

    if (orderIDParameterValue != NullOrderID) 
    { 
     parametersList.Clear(); 
     IParameter orderIDLockParameter = SQLClientFactory.GetParameter("@OrderID", orderIDParameterValue, Direction.In); 
     IParameter lockNameParameter = SQLClientFactory.GetParameter("@LockName", lockName, Direction.In); 
     parametersList.Add(orderIDLockParameter); 
     parametersList.Add(lockNameParameter); 

     dataAccess.ExecNonQuery("Insert_SP", parametersList); //Insert into table 2 

     orderID = orderIDParameterValue; 
    } 

    transaction.Complete(); 
} 

存储过程:GetNextOrder

SELECT top 1 @OrderID=ht.OrderID   
    FROM dbo.table1 ht WITH(nolock)  
    left join dbo.table2 htl WITH(nolock) on ht.orderid = htl.orderid   
    WHERE ht.Status in (0,1) 

存储过程:Insert_SP

CREATE procedure [dbo].[Insert_SP] (
@OrderID INT, 
@LockName VARCHAR(50) 
    ) 
AS 
BEGIN 
SET NOCOUNT ON 

insert into table2 (OrderID, LockName) VALUES (@OrderID, @LockName) 

SET NOCOUNT OFF 
END 
+0

那么其他SP如何看?在哪种情况下你有问题? – erikkallen

+0

我已经更新了SP。一种可能性是多个进程调用相同的代码。谢谢回复。 – Adarsh

+0

您是如何确定“多个进程能够重写锁并能够以极大影响执行写操作的”?顺便说一句,你没有在插入SB中使用表锁,而是使用行锁。 – erikkallen

回答

0

如何定义你的数据访问类?

我怀疑这是不是在新的事务入伍 - 在课堂上使用

connection.EnlistTransaction(Transaction.Current) 

+0

每个进程只有一个线程。如何招募交易帮助? – Adarsh

+0

@Adarsh好吧,没有这个,事务范围将不适用于你的代码。 – podiluska