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