Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite事务-保留锁何时生效_Sql_Sqlite_Transactions - Fatal编程技术网

Sqlite事务-保留锁何时生效

Sqlite事务-保留锁何时生效,sql,sqlite,transactions,Sql,Sqlite,Transactions,在发出SqliteConnection BeginTransaction()调用后,我想知道保留锁是否已启用并开始阻止写入 保留锁是否对应于实际的BeginTransaction调用,还是仅在调用Commit并运行事务之后才对应 我要求b/c,为了利用我现有的数据访问层,而不必每次都编写自定义事务来防止竞争情况,我不想调用BeginTransaction(),然后调用现有选择/插入/更新包装器的任何组合来解决手头的问题,同时具有独占写入访问权,然后最后调用提交。为了防止我试图避免的竞争条件,我会

在发出SqliteConnection BeginTransaction()调用后,我想知道保留锁是否已启用并开始阻止写入

保留锁是否对应于实际的BeginTransaction调用,还是仅在调用Commit并运行事务之后才对应

我要求b/c,为了利用我现有的数据访问层,而不必每次都编写自定义事务来防止竞争情况,我不想调用BeginTransaction(),然后调用现有选择/插入/更新包装器的任何组合来解决手头的问题,同时具有独占写入访问权,然后最后调用提交。为了防止我试图避免的竞争条件,我会要求在调用BeginTransaction时(即,在它返回之前的某个时间),事务上的保留锁“立即”处于活动状态

如果需要更多的澄清或细节,请让我知道,我很乐意提供。感谢您的专业知识。

专家说:

对数据库的第一次读取操作创建共享锁,第一次写入操作创建保留锁

当所有更改都适合页面缓存时,第一次实际写入操作将在
提交期间发生

要强制SQLite在执行
BEGIN
时锁定,请使用
beginimmediate
启动事务:

在“立即开始”之后,其他数据库连接将无法写入数据库或执行“立即开始”或“独占开始”操作。但是,其他进程可以继续从数据库中读取数据


如果您想防止读取(这不应该是必需的,因为所有事务在任何情况下都已正确序列化),请使用
BEGIN EXCLUSIVE

这里的回答:解决这个问题,尽管b/c没有关于这个问题的任何其他文档,但最好确认一下这个事实或更多关于它的细节。按照我上面提到的解决方案,需要对我的DAL进行重大修改,因此我很想知道锁在启动/提交时是如何工作的。再次感谢。这是个好消息。。。在写了我的第一个“自定义事务”(真的,真的很难看)之后,情况看起来很糟糕。我肯定会测试它的一个侧面的应用程序,但我现在没有时间,因为这种比赛条件已经消耗了近两个星期的发展!非常感谢这颗宝石我想知道事务使用的“立即开始”对应的隔离级别是什么?SqliteCommand方法BeginTransaction()将隔离级别作为其参数,我认为该值确定事务将使用哪种锁模式(即,立即开始、独占开始……)。除非我遗漏了什么,谢谢。ref:SQLite的事务总是可序列化的。@CL,在WAL模式下不为true。