SQLite and checkout semantic

SQLite and checkout semantic

本文关键字:semantic checkout and SQLite      更新时间:2023-10-16

我开始研究如何使用SQLite。我想做的(以及其他事情)是实现某种类型的checkout语义。也就是说,如果一个sql连接对一列或一行进行了签出锁定,那并不重要。我不希望其他连接被允许读取或修改该数据,直到第一个连接释放锁定或第一个连接关闭/应用程序崩溃等

这可以在SQLite中实现吗?

/提前感谢!

SQLite并不是真正为高并发性而设计的,它的锁定模型是在数据库级别进行锁定。如果您需要记录级别的锁定(大多数情况下不需要),那么您需要一个基于服务器的RDBMS。

数据库通常并不真正支持签出语义。数据库保证事务隔离,但由于它们不能保证事务成功,因此可以让另一个事务使用另一个刚刚修改(尚未提交)的旧版本数据进行处理,如果事务实际上变得不可序列化,则只回滚一个。即使他们确实使用了锁定,他们仍然不明确地支持它。你读了一行,它就变成了读锁定,如果你写了它,它就会变成写锁定,但你对它没有任何控制

当您开始在事务中写入时,Sqlite尤其会锁定整个数据库,除非处于WAL模式。您可以通过使用begin immediate而不是仅使用begin启动事务来强制锁定。然而,在WAL模式中,它支持某种并发性。不幸的是,我不知道确切的模式。

无论如何,您可能最终不得不自己实现签出语义。或者不用它,因为必须处理过时的签出,所以签出语义相当复杂。