1

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

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

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

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

4

1 回答 1

2

文档说:

对数据库的第一个读操作创建一个共享锁,第一个写操作创建一个保留锁。

当所有更改都适合页面缓存时,第一个实际写入操作将在COMMIT.

要在执行时强制 SQLite 锁定,请BEGIN使用以下命令启动事务BEGIN IMMEDIATE

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

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

于 2013-03-26T20:26:09.053 回答