Блокирует ли начало транзакции с сериализуемым уровнем изоляции немедленно? - PullRequest
0 голосов
/ 17 мая 2018

Должны ли какие-либо чтения (SELECT), сделанные в Table1 другим потоком, после запуска транзакции, но до выполнения UPDATE, блокироваться, или UPDATE необходимо сначала начать выполнение?

var _con = new SqliteConnection( "Data Source=" + FileName );
_con.Open();

SqliteCommand _cmd = _con.CreateCommand();
_cmd.CommandType = CommandType.Text;

_con.BeginTransaction(IsolationLevel.Serializable);

// UPDATE
_cmd.CommandText = "UPDATE Table1 SET field1 = 'a' WHERE Id = 1";
_cmd.ExecuteReader();

_cmd.Transaction.Commit();

1 Ответ

0 голосов
/ 18 мая 2018

В SQLite все транзакции (явные и автоматические) являются сериализуемыми.

По умолчанию транзакции SQLite имеют значение DEFERRED , что означает, что блокировки чтения / записи принимаются только тогда, когда файл базы данных действительно требуется для чтения / записи (а запись обычно происходит только тогда, когда кэши сбрасываются, когда транзакция совершается).

В режиме отката журнала читатели и писатель блокируют друг друга; в режиме WAL читатели и записывающее устройство могут одновременно обращаться к БД, но при этом может быть только один записывающий.

Однако Xamarin не использует значения по умолчанию; BeginTransaction () немедленно запускает транзакцию в режиме EXCLUSIVE, что означает, что она конфликтует со всеми другими параллельными транзакциями. (Режим WAL не имеет значения.) Очевидно, вы не должны использовать какой-либо параллелизм в Xamarin.

...