2013-08-27 4 views
0

Как я могу заставить мои транзакции ждать, если в MySQL все еще есть транзакция без привязки/отказа от рулона?Подождите, пока другая транзакция совершит/откат до начала другой транзакции?

В настоящее время я делаю операции на стороне коды, а не на DB сохраняемой стороны процессуальной, как это:

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

Смежные вопросы