我正在考虑将BaseX用作更灵活的数据库。
它如何处理数据库并发?它是如何在Web应用程序场景中工作的,其中两个不同的用户可以更新相同的数据并有效地获得"脏读"?
答案 0 :(得分:3)
它如何在Web应用程序场景中运行,其中两个不同的用户可以更新相同的数据并有效地获得“脏读”?
确保:事务彼此隔离,因此不会发生更新的异常。
它如何处理数据库并发?
查看BaseX wiki page about transaction management,其中详细介绍了该方法。免责声明:我在thesis work期间为BaseX实现了较新的数据库锁定,因此我参与了该项目。
BaseX应用了几种机制来防止碰撞事务。旧的进程锁定(仍然可以使用GLOBALLOCK
选项启用)只是拒绝进程内的多个查询,可以在多个数据库实例中实现并行执行,同时通过以下方式实现基本隔离每个数据库文件系统锁(没有任何关于死锁的保证,......)。
较新的数据库锁定通过在数据库级别应用两个锁相来隔离并行事务。因此,访问多个数据库的两个查询确实并行运行,因为它们访问不同的数据库,否则其中一个必须等待(但它们不会同时运行,当然)。缺点是,由于我们希望支持无死锁执行,我们进行了严格的两阶段锁定,它在执行查询之前获取所有数据库锁,但是因为确定将在动态中访问哪些数据库而受到惩罚语言为XQuery,通常在所有数据库上都没有全局锁定。
对于未来(给定时间允许,并且没有设置任何时间表),一些优化正在排队,特别是放宽了两阶段锁定的严格性和乐观并发控制我在论文中已经评估过将为并行执行带来巨大收益,尤其是对于Web应用程序场景。