Sqlite事务-保留锁何时生效
在发出SqliteConnection BeginTransaction()调用后,我想知道保留锁是否已启用并开始阻止写入 保留锁是否对应于实际的BeginTransaction调用,还是仅在调用Commit并运行事务之后才对应 我要求b/c,为了利用我现有的数据访问层,而不必每次都编写自定义事务来防止竞争情况,我不想调用BeginTransaction(),然后调用现有选择/插入/更新包装器的任何组合来解决手头的问题,同时具有独占写入访问权,然后最后调用提交。为了防止我试图避免的竞争条件,我会要求在调用BeginTransaction时(即,在它返回之前的某个时间),事务上的保留锁“立即”处于活动状态 如果需要更多的澄清或细节,请让我知道,我很乐意提供。感谢您的专业知识。专家说: 对数据库的第一次读取操作创建共享锁,第一次写入操作创建保留锁 当所有更改都适合页面缓存时,第一次实际写入操作将在Sqlite事务-保留锁何时生效,sql,sqlite,transactions,Sql,Sqlite,Transactions,在发出SqliteConnection BeginTransaction()调用后,我想知道保留锁是否已启用并开始阻止写入 保留锁是否对应于实际的BeginTransaction调用,还是仅在调用Commit并运行事务之后才对应 我要求b/c,为了利用我现有的数据访问层,而不必每次都编写自定义事务来防止竞争情况,我不想调用BeginTransaction(),然后调用现有选择/插入/更新包装器的任何组合来解决手头的问题,同时具有独占写入访问权,然后最后调用提交。为了防止我试图避免的竞争条件,我会
提交期间发生
要强制SQLite在执行BEGIN
时锁定,请使用beginimmediate
启动事务:
在“立即开始”之后,其他数据库连接将无法写入数据库或执行“立即开始”或“独占开始”操作。但是,其他进程可以继续从数据库中读取数据
如果您想防止读取(这不应该是必需的,因为所有事务在任何情况下都已正确序列化),请使用BEGIN EXCLUSIVE
这里的回答:解决这个问题,尽管b/c没有关于这个问题的任何其他文档,但最好确认一下这个事实或更多关于它的细节。按照我上面提到的解决方案,需要对我的DAL进行重大修改,因此我很想知道锁在启动/提交时是如何工作的。再次感谢。这是个好消息。。。在写了我的第一个“自定义事务”(真的,真的很难看)之后,情况看起来很糟糕。我肯定会测试它的一个侧面的应用程序,但我现在没有时间,因为这种比赛条件已经消耗了近两个星期的发展!非常感谢这颗宝石我想知道事务使用的“立即开始”对应的隔离级别是什么?SqliteCommand方法BeginTransaction()将隔离级别作为其参数,我认为该值确定事务将使用哪种锁模式(即,立即开始、独占开始……)。除非我遗漏了什么,谢谢。ref:SQLite的事务总是可序列化的。@CL,在WAL模式下不为true。