Xquery BaseX如何处理并发性?

Xquery BaseX如何处理并发性?,xquery,basex,database-concurrency,Xquery,Basex,Database Concurrency,我正在考虑使用BaseX作为更灵活的数据库 它如何处理数据库并发性?在web应用程序场景中,两个不同的用户可以更新相同的数据并有效地获得“脏读”时,它是如何工作的 在web应用程序场景中,两个不同的用户可以更新相同的数据并有效地获得“脏读”时,它是如何工作的 确保:事务彼此隔离,因此不会发生更新的异常 它如何处理数据库并发性 请查看,其中详细描述了该方法。免责声明:我在发布期间为BaseX实现了更新的数据库锁定,因此我参与了该项目 BaseX应用了几种机制来防止事务冲突。旧的进程锁定(仍然可以使

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

它如何处理数据库并发性?在web应用程序场景中,两个不同的用户可以更新相同的数据并有效地获得“脏读”时,它是如何工作的

在web应用程序场景中,两个不同的用户可以更新相同的数据并有效地获得“脏读”时,它是如何工作的

确保:事务彼此隔离,因此不会发生更新的异常

它如何处理数据库并发性

请查看,其中详细描述了该方法。免责声明:我在发布期间为BaseX实现了更新的数据库锁定,因此我参与了该项目

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

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


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

谢谢。因此给出了一个场景,其中一些数据在两个单独的浏览器上读取ers/用户同时-然后用户1更新记录上数据库中的数据-然后用户2更新相同的数据..用户1的数据不会被覆盖吗?这是必须手动考虑的因素吗?一个查询(页面请求)是一个事务,每个事务是原子的。如果一个页面被获取,另一个用户会更改某些内容(尚未反映在页面中)然后将更改写回数据库系统,其他用户的更改将被覆盖(如果您不应用任何进一步的保护措施)。当您没有跨多个页面查询的事务时,这与所有其他数据库系统几乎相同。谢谢。仅供参考。如果您在SQL server中执行此操作,并且表中有一个时间戳字段,则如果时间戳不匹配,它将拒绝第二次更改。