Sqlite事务 - 保留锁何时生效

时间:2013-03-26 19:59:46

标签: sql sqlite transactions

在发出SqliteConnection BeginTransaction()调用后,我想知道Reserve Lock是否参与并开始阻止写入?

Reserve Lock是否与实际的BeginTransaction调用相对应,还是仅在调用Commit并且事务运行后?

我问b / c,为了利用我现有的数据访问层,而不是每次我需要一个时间来编写自定义事务来防止竞争条件,我不打算调用BeginTransaction(),并且然后调用现有的Select / Insert / Update包装器的任意组合来解决手头的问题,同时具有独占的写访问权限,然后最终调用Commit。为了防止我试图避免的竞争条件,我要求在调用BeginTransaction时“立即”激活事务上的保留锁定(即,在它返回之前的某个时间)。

如果需要更多说明或细节,请告诉我,我很乐意提供。谢谢你的专业知识。

1 个答案:

答案 0 :(得分:2)

documentation说:

  

针对数据库的第一个读取操作会创建一个SHARED锁,第一个写操作会创建一个RESERVED锁。

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

要强制SQLite在执行BEGIN时锁定,请使用BEGIN IMMEDIATE启动交易:

  

在BEGIN IMMEDIATE之后,没有其他数据库连接可以写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE。但是,其他进程可以继续从数据库中读取。

如果您想要阻止读取(由于所有事务在任何情况下都已正确序列化,因此不应该这样做),请使用BEGIN EXCLUSIVE