Xamarin.android 是否立即使用可序列化隔离级别阻止启动事务?

Xamarin.android 是否立即使用可序列化隔离级别阻止启动事务?,xamarin.android,ado.net,sqlite-net,Xamarin.android,Ado.net,Sqlite Net,在事务启动后但在执行更新之前,是否应阻止另一个线程对表1进行的任何读取(SELECT),或者更新是否需要首先开始执行 var _con = new SqliteConnection( "Data Source=" + FileName ); _con.Open(); SqliteCommand _cmd = _con.CreateCommand(); _cmd.CommandType = CommandType.Text; _con.BeginTransaction(IsolationLev

在事务启动后但在执行
更新之前,是否应阻止另一个线程对
表1
进行的任何读取(
SELECT
),或者
更新
是否需要首先开始执行

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();

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

默认情况下,SQLite的事务,这意味着只有在数据库文件实际需要读/写时才使用读/写锁(并且通常只有在事务提交时刷新缓存时才会执行写操作)

在日志回滚模式下,读卡器和写卡器相互阻塞;在WAL模式下,读卡器和写卡器可以同时访问数据库,但仍然只能有一个写卡器

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

我认为单个事务读取并锁定整个数据库效率很低。SQLite没有不同的隔离级别;所有事务都可以序列化。这种行为取决于你是否使用WAL模式。这与Microsoft的SQL Server无关。@CL.需要澄清的是,是否所有SQLite语句都作为事务隐式执行或“包装在”事务中,并且默认情况下这些隐式事务也可以序列化?Doe的WAL允许脏读——“WAL提供了更多的并发性,因为读卡器不阻止写程序,而写程序也不阻止读卡器。读和写可以同时进行。”-这听起来不像是一个可序列化的隔离级别?“原始内容保留在数据库文件中,更改被附加到单独的WAL文件中。[这]允许读者在将更改同时提交到WAL的同时,继续从原始未更改的数据库进行操作。“所以WAL相当于读取未提交的ISO隔离级别?关于xamarin的说明解释了很多,以及我为什么会侥幸逃脱一些不幸(我不认为我有那么多运气)。我想安全总比抱歉好。因为我无法通过在其自己的进程中运行的“后台”服务进行单步调试(vs debugger不会附加;超时),所以打印输出是测试/调试其中sqlite代码的唯一方法(我想也许gdb可以用于设备本身,但我从未为.net clr设置过符号,也不确定这是否可能,而且我已经很久没有使用gdb了)。