Транзакции,MySql,EntityFramework
От: SoLame  
Дата: 10.07.15 12:54
Оценка:
Всем привет.


Коллеги, подскажите как правильно.

Пытаюсь проверить если запись в таблице и если нет ее, добавить ее. Код ниже.
В результате наблюдаю задвоения записей...
Подскажите, как их избежать?
база: 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();
          }
     }
Re: Транзакции,MySql,EntityFramework
От: Somescout  
Дата: 13.07.15 09:57
Оценка:
Как я понимаю этот код выполняется в нескольких потоках, проверка существования и создание новой записи неатомарна и потому возможно задвоение записей при любом режиме изоляции транзакций. На мой взгляд есть два решения:
* Блокировка — программная (есть программа выполняется в одном экземпляре) или эксклюзивная блокировка таблицы (строк или всей таблицы), которая предотвращает возможность работы с таблицей двух потоков одновременно.
* Добавление уникального индекса — не знаю, насколько это возможно в вашей базе, но в этом случае будет корректно возникать исключение при выходе из транзакции с откатом всех изменений.
ARI ARI ARI... Arrivederci!
Отредактировано 13.07.2015 11:18 Somescout . Предыдущая версия .
Re: Транзакции,MySql,EntityFramework
От: MasterZiv СССР  
Дата: 13.07.15 11:18
Оценка:
Здравствуйте, SoLame, Вы писали:

SL>Всем привет.



SL>Коллеги, подскажите как правильно.


SL>Пытаюсь проверить если запись в таблице и если нет ее, добавить ее. Код ниже.

SL>В результате наблюдаю задвоения записей...
SL>Подскажите, как их избежать?
SL>база: MySql, доступ через "dotConnect for MySQL"

Таблицы на каком движке MySQL ?
(show create table ...)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.