如果在事务开始之后但在执行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();
答案 0 :(得分:1)
在SQLite中,所有事务(显式事务和自动事务)都是可序列化的。
默认情况下,SQLite的事务are DEFERRED,这意味着只有在实际需要读取/写入数据库文件时才会执行读/写锁定(并且写入通常仅在刷新缓存时发生)当事务提交时。)
在期刊回滚模式下,读者和作者互相阻挡;在WAL模式下,读者和作者可以同时访问数据库,但仍然只能有一个编写者。
但是,Xamarin不使用默认值; BeginTransaction()立即以EXCLUSIVE模式启动事务,这意味着它与所有其他并发事务冲突。 (WAL模式没有区别。) 显然,你不应该在Xamarin中使用任何并发性。