2011-06-13 30 views
0

我开始调查使用SQLite。我想要做的(除其他之外)是实现某种结账语义。也就是说,如果一个sql连接在一列或行上签出锁定并不重要。我希望在第一次连接释放锁或第一次连接关闭/应用程序启动等之前,不允许读取或修改该数据的其他连接。SQLite和结帐语义

这会在SQLite中实现吗?

/提前致谢!

回答

0

数据库通常并不真正支持结帐语义。数据库保证了事务隔离,但是由于它们不能保证事务成功,他们可以让另一个事务继续使用老版本的数据,而旧数据只是修改了另一个事务(并且尚未提交),并且事务实际上变为了不可序列化,回滚一个。即使他们使用锁定,他们仍然不明确支持它。你读这行,它变成了读锁,如果你写它,它就变成了写锁,但是你没有任何控制权。

当您开始在事务中写入时,Sqlite特别锁定整个数据库,除非在WAL模式下。您可以通过begin immediate开始交易来强制锁定,而不仅仅是begin。但在WAL模式下,它支持某种并发性。不幸的是我不知道确切的模式。

无论如何,您可能最终不得不自己实现结帐语义。或者没有它,因为结账语义很复杂,必须处理陈旧结账。

1

SQLite并不是专为繁重的并发而设计的 - 它的锁定模式是锁定在数据库级别。如果您需要记录级锁定(大多数情况下您不需要),则需要基于服务器的RDBMS。

+0

+1 SQLite主要是为单用户系统(或最多只有一些用户同时使用)设计的,例如移动应用程序,桌面应用程序,嵌入式系统等...... – 2011-06-13 11:25:13

+0

不再适用于写入3.7.0+ - 前进日志(WAL)模式,尽管该模式在所有使用情况下都不可用。 – 2011-06-13 11:27:47