2013-08-27 46 views
0

如何在MySQL中仍存在未提交/未回滾支持的事務時讓我的事務等待?等待其他事務在開始另一個事務之前提交/回滾?

目前我做我的交易在代碼方面,而不是在數據庫存儲過程的一面,就像這樣:

cmd.Connection.BeginTransaction(); 
try { 
    // db codes here 
    cmd.Transaction.Commit(); 
} catch { 
    cmd.Transaction.Rollback(); 
    throw; 
} finally { 
    cmd.Connection.Close(); 
} 

我要爲其他交易要等到前一個交易就完成了。因爲在我的一些存儲過程中,在插入外鍵時得到了MAX(id),其中id是一個自動遞增的列,它也在同一事務中創建。不過,這並不在我的當前設置2周時發生的交易,同時上述工作,是發生了什麼事情是這樣的:

Begin Trans1 
Begin Trans2 
Trans1: insert a values(); --id = 1 
Trans2: insert a values(); --id = 1 
Trans1: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 1 
Trans2: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 1 
Commit Trans1 
Commit Trans2 --id = 2, aid = 1 

我希望是這樣的:

Begin Trans1 
Wait Trans2 
Trans1: insert a values(); --id = 1 
Trans1: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 1 
Commit Trans1 
Begin Trans2 
Trans2: insert a values(); --id = 2 
Trans2: insert b(aid, col1) values((select MAX(id) from a), 'test'); --aid = 2 
Commit Trans2 

是它可能是這樣嗎?

+0

我已經編輯我的帖子檢查,如果它在你的情況下幫助 – Anuj

回答

1

使用IsolationLevel.ReadCommitted就可以避免被其他交易

cmd.Connection.BeginTransaction(IsolationLevel.ReadCommitted); 

可以使用TransactionScope類的訪問參與事務的表。 TransactionScope使代碼塊成爲事務性的,直到代碼沒有被提交時,表將被鎖定,並且如果其他一些請求同一個表,那麼它將不得不等待,直到正在運行的事務被提交或回滾。

refer

+0

非常感謝。我實際上已經在查看'IsolationLevel',但我無法理解MSDN文章。 XD –

+0

我使用'IsolationLevel.Serializable'來確保讀取也被鎖定。其他交易會等待,直到表被解鎖,否則它只會拋出異常? –

+0

是的其他交易將等待 – Anuj