是否立即开始具有可序列化隔离级别的事务?

时间:2018-05-17 16:32:55

标签: xamarin.android ado.net sqlite-net

如果在事务开始之后但在执行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 :(得分:1)

在SQLite中,所有事务(显式事务和自动事务)都是可序列化的。

默认情况下,SQLite的事务are DEFERRED,这意味着只有在实际需要读取/写入数据库文件时才会执行读/写锁定(并且写入通常仅在刷新缓存时发生)当事务提交时。)

在期刊回滚模式下,读者和作者互相阻挡;在WAL模式下,读者和作者可以同时访问数据库,但仍然只能有一个编写者。

但是,Xamarin不使用默认值; BeginTransaction()立即以EXCLUSIVE模式启动事务,这意味着它与所有其他并发事务冲突。 (WAL模式没有区别。) 显然,你不应该在Xamarin中使用任何并发性。