Всем привет.
Коллеги, подскажите как правильно.
Пытаюсь проверить если запись в таблице и если нет ее, добавить ее. Код ниже.
В результате наблюдаю задвоения записей...
Подскажите, как их избежать?
база: MySql, доступ через "dotConnect for MySQL"
using (var db = new SomeContext())
{
using (var transaction = db.Database.BeginTransaction(IsolationLevel.Serializable))
{
var qry = db.SomeTable.Where(...);
var m = qry.SingleOrDefault();
if (m == null)
{
db.SomeTable.Add(new SomeEntry{});
}
...
db.SaveChanges();
transaction.Commit();
}
}
Как я понимаю этот код выполняется в нескольких потоках, проверка существования и создание новой записи неатомарна и потому возможно задвоение записей при любом режиме изоляции транзакций. На мой взгляд есть два решения:
* Блокировка — программная (есть программа выполняется в одном экземпляре) или эксклюзивная блокировка таблицы (строк или всей таблицы), которая предотвращает возможность работы с таблицей двух потоков одновременно.
* Добавление уникального индекса — не знаю, насколько это возможно в вашей базе, но в этом случае будет корректно возникать исключение при выходе из транзакции с откатом всех изменений.
ARI ARI ARI... Arrivederci!