在发出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/