У меня такая ситуация:
Если у вас есть база данных MySQL с таблицей InnoDB, которую я использую для хранения уникальных номеров. Я запускаю транзакцию, читаю значение (например, 1000471), сохраняю это значение в другой таблице и обновляю увеличенное значение (100472). Теперь я хочу избежать того, чтобы кто-то еще считал значение во время выполнения моей транзакции.
Если бы я использовал простой MySQL, я бы сделал что-то вроде этого:
Exceute ("LOCK tbl1 READ");
Execute ("SELECT ... from tbl1");
Execute ("INSERT into tbl2");
Execute ("UNLOCK TABLES");
но поскольку я использую SubSonic как DAL, а код не должен зависеть от mysql, я должен использовать TransactionScope.
Мой код:
TransactionOptions TransOpt = new TransactionOptions();
TransOpt.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
TransOpt.Timeout = new TimeSpan(0, 2, 0);
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew, TransOpt))
{
// Select Row from tbl1
// Do something
ts.Complete();
}
Согласно TransactionOptions
system.transactions.isolationlevel
Эффект, которого я хочу достичь, может быть реализован с помощью IsolationLevel.ReadCommitted, но я все еще могу читать строку вне транзакции (если я попытаюсь ее изменить, я получаю блокировку, поэтому транзакция работает)
Есть ли у кого-нибудь предложения? Возможна ли блокировка чтения с помощью TransactionScope