讓我們想象我有兩個線程,它們在具有ReadCommitted隔離級別的特定於線程的TransactionScopes中執行一些面向數據庫的代碼。但是有一些表格應該共享數據(不應該創建重複數據)。TransactionScope細微差別
using (var transactionScope = new TransactionScope(IsolationLevel.ReadCommitted))
{
...//some code
if (!_someRepository.IsValueExists(value))
_someRepository.AddData(value);
...//some code
transactionScope.Complete();
}
的問題是兩個線程可以檢查是否在差不多同一時間存在的數據,如果沒有 - 創建複製數據(約束不會在這裏幫助:我有防止意外情況發生)。我想這是一個微不足道的問題,但它通常如何解決?
我看到下面的示意性的解決方案:
using (var transactionScope = new TransactionScope(IsolationLevel.ReadCommitted))
{
...//some code
transactionScope.IsolationLevel = IsolationLevel.ReadUncommitted; //change Isolation Level
lock (_sharedDataLockObject)
{
if (!_someRepository.IsValueExists(value))
_someRepository.AddData(value);
}
transactionScope.IsolationLevel = IsolationLevel.ReadCommitted; //reset IsolationLevel
...//some code
transactionScope.Complete();
}
這種解決方案的第一個問題是,TransactionScope的不支持的IsolationLevel修改。但讓我們想象我在這裏使用ADO.NET事務。不過,我不確定它是否有效。
`快照`隔離級別是否有助於您的情況?這個級別減少了複製修改行時的鎖定。這樣,其他事務仍然可以讀取舊數據,而無需等待解鎖。 – whyleee 2011-02-14 20:25:15
@whyleee:但我的問題是添加記錄,但沒有修改 – SiberianGuy 2011-02-14 20:37:18
但是,如果你需要一個鎖,`ReadCommitted`隔離級鎖定來自其他事務的寫鎖的記錄。 – whyleee 2011-02-14 20:44:56