如果我有一個函數編輯我的web服務中的數據庫,我只希望一次執行一個線程,如果他們嘗試編輯同一行。只有當值相同時才鎖定?
void EditCheck(long checkid)
{
if (isCheckCosed)
throw new Exception("check is already closed");
//do stuff
//after i edit my check i want to close it.
CloseCheck();
}
我知道我可以鎖定全功能,但後來我鬆散的性能與特點,因爲它幾乎從來沒有不同的線程將嘗試編輯相同的檢查。
有沒有辦法只鎖定其他線程具有相同的checkid?
UPDATE
我使用OleDbConnection
和MySqlConnection
OleDbCommand oleDbCommand = AccessTrans != null ?
new OleDbCommand(sql, AccessConn, AccessTrans) : new OleDbCommand(sql, AccessConn);
oleDbCommand.ExecuteNonQuery();
相同功能爲MySqlCommand
,然後我強制使用正常的插入和更新SQL命令。 並檢查交易是否存在。所以如果你想要一個事務或者不在你的上層函數中這個函數可以工作。
從數據庫中讀取我要填補DataTable
OleDbCommand oleDbCommand = AccessTrans != null ? new OleDbCommand(sql, AccessConn, AccessTrans) : new OleDbCommand(sql, AccessConn);
OleDbDataAdapter dAdapter = new OleDbDataAdapter();
dAdapter.SelectCommand = oleDbCommand;
dAdapter.Fill(dTable);
return dTable;
不應該在數據庫端處理這個問題嗎?你真的有問題嗎?還是僅僅基於假設? –
如何寫入數據訪問?如果你使用EF這可能會有所幫助:http://blogs.msdn.com/b/alexj/archive/2009/05/20/tip-19-how-to-use-optimistic-concurrency-in-the- entity-framework.aspx – Lev
你能說明你是如何訪問數據庫的嗎?有很多好的工具內置到許多數據訪問方法中來處理這個問題(只有一個客戶端連接到數據庫時,客戶端發生的任何解決方案纔會工作。如果你的程序的兩個副本都調用'EditCheck'作爲相同的'checkid',那麼當前的答案將不起作用) –