0

本番システムで奇妙な問題が発生しています。同じスコープ内で no_lock を使用した読み取り操作とテーブル ロックを使用した書き込み操作で定義された readCommitted トランザクションがあります。

ただし、複数のプロセスがロックをオーバーライドし、大きな影響を与える書き込み操作を実行できます。助けてください!。ありがとう。

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
4

1 に答える 1

0

dataAccess クラスはどのように定義されていますか?

新しいトランザクションに参加していないと思われます-使用

connection.EnlistTransaction(Transaction.Current) 

そのクラスで。

于 2012-09-13T12:37:28.083 に答える