在发出SqliteConnection BeginTransaction()调用后,我想知道Reserve Lock是否参与并开始阻止写入?
Reserve Lock是否与实际的BeginTransaction调用相对应,还是仅在调用Commit并且事务运行后?
我问b / c,为了利用我现有的数据访问层,而不是每次我需要一个时间来编写自定义事务来防止竞争条件,我不打算调用BeginTransaction(),并且然后调用现有的Select / Insert / Update包装器的任意组合来解决手头的问题,同时具有独占的写访问权限,然后最终调用Commit。为了防止我试图避免的竞争条件,我要求在调用BeginTransaction时“立即”激活事务上的保留锁定(即,在它返回之前的某个时间)。
如果需要更多说明或细节,请告诉我,我很乐意提供。谢谢你的专业知识。
答案 0 :(得分:2)
针对数据库的第一个读取操作会创建一个SHARED锁,第一个写操作会创建一个RESERVED锁。
当所有更改都适合页面缓存时,第一次实际写入操作将在COMMIT
期间发生。
要强制SQLite在执行BEGIN
时锁定,请使用BEGIN IMMEDIATE
启动交易:
在BEGIN IMMEDIATE之后,没有其他数据库连接可以写入数据库或执行BEGIN IMMEDIATE或BEGIN EXCLUSIVE。但是,其他进程可以继续从数据库中读取。
如果您想要阻止读取(由于所有事务在任何情况下都已正确序列化,因此不应该这样做),请使用BEGIN EXCLUSIVE
。