I have a weird problem from production systems. I have readCommitted transaction defined with read operation with no_lock and write operation with table lock in the same scope.
However, multiple processes are able to override the lock and able to perform write operation with great impact. Please help!. Thanks.
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();
}
Stored procedure: 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)
Stored procedure: 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