sql - Sqlite事务-储备锁何时生效

标签 sql sqlite transactions

在发出SqliteConnection BeginTransaction()调用后,我想知道这时预留锁定是否起作用并开始阻止写操作?

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

我要求b / c,以便利用我现有的数据访问层,而不必每次都需要编写自定义事务来防止出现竞争情况时,我就不会调用BeginTransaction(),然后再调用任何现有的Select / Insert / Update包装器的组合可以解决当前的问题,同时具有独占写入访问权限,然后最终调用Commit。为了防止我试图避免的竞争状况,我要求在调用BeginTransaction时(即在返回之前的某个时间)“立即”激活事务的储备锁。

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

最佳答案

documentation说:


对数据库的第一次读取操作将创建SHARED锁定,而第一次写入操作将创建RESERVED锁定。


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

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


立即开始BEGIN之后,其他任何数据库连接将无法写入数据库,也不能立即进行BEGIN或BEGIN EXCLUSIVE。但是,其他进程可以继续从数据库中读取。


如果要防止读取(在所有情况下都正确序列化了所有事务,则不必这样做),请使用BEGIN EXCLUSIVE

关于sql - Sqlite事务-储备锁何时生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15646289/

相关文章:

mysql - mysql 的 WHERE 子句中可以使用别名吗?

mysql - 我可以有一个没有聚簇索引的主键吗?我还可以拥有多值聚簇索引吗?

sql - 如何查看 X++ select 语句的 SQL 表达式?

java - 如何在抽屉导航中的 fragment 上显示 SQLite 数据库数据?

python - 在 Django 模型中,如何创建一个在刷新时重置为 1 的字段?

java - JPA 乐观锁定与同步 Java 方法

java - "proxied"状态对于 Hibernate session 意味着什么

php - session 变量无法识别

Android JSON 服务器响应可能无效错误

sql - 如何在go lang中测试事务回滚和提交