BaseX 如何处理并发?

How does BaseX handle concurrency?

我正在考虑使用 BaseX 作为更灵活的数据库。

它是如何处理数据库并发的?它如何在 Web 应用程序场景中工作,其中两个不同的用户可以更新相同的数据并有效地获得 "dirty read"?

How does it work in a web app scenario, where two different users could update the same data and effectively get a "dirty read"?

确保:事务之间是相互隔离的,这样就不会出现更新异常。

How does it handle database concurrency?

看看BaseX wiki page about transaction management, where the approach is described in-detail. Disclaimer: I implemented the newer database locking for BaseX during my thesis work,所以我参与了这个项目。

BaseX 应用了多种机制来防止交易冲突。旧的 进程锁定 (仍然可以使用 GLOBALLOCK 选项启用)简单地拒绝进程内的多个查询,可以在多个数据库实例中实现并行执行,而基本隔离是通过每个数据库的文件系统锁实现的(没有关于死锁的任何保证,...)。

较新的数据库锁定通过在数据库级别应用两阶段锁定来隔离并行事务。因此,访问多个数据库的两个查询并行执行 运行,因为它们访问不同的数据库,否则其中一个将不得不等待(但它们肯定不会同时 运行)。一个缺点是,因为我们想要支持无死锁执行,所以我们采用了严格的两阶段锁定,它在执行查询之前获取所有数据库锁,但会受到惩罚,因为在动态查询中很难确定将访问哪些数据库作为 XQuery 的语言,经常因所有数据库上的全局锁而失败。

对于未来(如果时间允许,并且没有设置时间表)一些优化正在排队,特别是放宽对两阶段锁定的严格性和乐观并发控制我已经在我的论文中进行了评估,这将在并行执行方面带来巨大的收益,尤其是对于 Web 应用程序场景。