问题标签 [database-concurrency]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
983 浏览

sql-server - 在 WITH UPDLOCK、HOLDLOCK 表上运行存储过程时避免死锁

我正在维护一个存储过程,每当用户访问网页时都会执行该存储过程。

存储过程:

我可以使用抛出异常TRY CATCH THROW END CATCH并仍然避免表上的死锁TargetAccount吗?我需要知道它何时无法同步。

如果存储过程未能完成,有没有办法释放表锁?

0 投票
0 回答
138 浏览

java - 在边和顶点上定向 db 并发

我们一直在努力动态创建顶点,同时将其添加到新创建的类中,并在多线程环境中使用常规蓝图查询为其添加边,因为某些缓存会导致问题,并且每次进行查询时都会查找旧版本的顶点。我们尝试通过(graph.getrawGraph().getLocalCache().clear())从池中获取连接后禁用本地缓存

但这似乎在某些情况下有效。无论我们在哪里进行更新,我们都在使用事务和重试机制(以克服并发问题)。但不知何故,在某些地方旧版本被捕获,因此应用程序抛出空指针异常。

为了解决顶点存在的问题,我们使用命令直接通过选择查询触发来查询数据库: Iterable nodes = (Iterable) graph.command(new OCommandSQL("SELECT * FROM v WHERE " + propName + "='" + propValue + “' “))。执行();

不知何故,这很好用。但是现在这个查询返回给我们类 value = null 的顶点为:v(null)[some@Rid],但实际上在创建后理想情况下它也应该带有类名。这为向该顶点添加边造成了困难。请在这方面启发我们,因为可以推荐哪些程序来处理这些情况。

谢谢并恭祝安康

瓦伦塔欣

0 投票
1 回答
1449 浏览

concurrency - 如何限制气流中的当前工作?

我是气流的新手。但我现在正在研究如何限制 Airflow 中的当前工作。是否有人对 Airflow 中的并发或节流有一点了解。任何建议都会有所帮助。非常感谢。

0 投票
1 回答
2008 浏览

mysql - MySQL:单个表中的死锁更新...在哪里

此配置引发了下一个问题:

  • MySQL 5.7.10
  • 春天 4.0.5
  • 春季批次 3.0.1
  • 10到20个线程之间的Spring ThreadPoolTask​​Executor

当某些线程尝试在单个表中执行 UPDATE...WHERE 时,问题是死锁。

表格是:

更新语句是:

MySQL 对此语句的解释是: 在此处输入图像描述

该问题的显示状态引擎是:

从 innodb 数据库变量中,我注意到innodb_thread_concurrency值为 32。

选定的分区包含 21853907 行。

我试图做一个简单的 UPDATE 语句。我只使用 fecha_fac 过滤以访问所需的分区,然后使用索引字段进行过滤。

所以,我的第一个也是主要的问题是:我怎样才能修复这个事务锁?任何建议,提示,...?

任何其他重要的问题是:

  • 从 EXPLAIN 输出:即使在单个表更新中,类型(范围)是否会更好?还是单表更新的最佳类型?
  • 从 EXPLAIN 输出:最终密钥是 IDX_INV_INT_ID 而不是 IDX_MSISDN 是否正确?IDX_INV_INT_ID 索引一个空列。
  • 它是否有助于将 innodb_thread_concurrency 参数设置为 0(无限并发)?
  • SHOW STATUS 输出中是否有任何数据可以帮助我而我没有注意到?

除了我的问题,非常感谢任何帮助或建议。

提前致谢。

0 投票
2 回答
651 浏览

sql - SQL SUM 表达式和锁

我对正确的 SQL 解决方案有疑问。

当前情况:我的数据库包含带有银行交易(贷记和借记)的表。

  • 信用交易被签署为正数(+),并且
  • 借记交易为负金额 (-)。

使用数据库的应用程序是一个多用户 webapp,因此事务表包含许多行,它们引用不同的用户。一些 webapp 操作需要检查登录用户的实际余额,使用 Transactions 表并保存借记 Transaction(操作价格)。

我想到了这个机制的架构,有一些疑问:

  1. 每次用户请求时将余额计算为交易贷方和借方的总和是一个好主意吗?我知道这对 db 可能效率低下。也许我应该在某处保存快照?

  2. 当一个用户检查“余额”作为贷记/借记交易的总和,而另一个用户同时保存借记交易(因为他/她更快)时,如何确保数据凝聚力?我想到了一个悲观的锁,但我应该锁什么?我知道在 Postgresql(我使用的数据库)上可能无法使用聚合锁定 (SUM)。”

对不起我的英语,我希望我的问题是可以理解的。:)

0 投票
1 回答
2644 浏览

amazon-web-services - DynamoDB:是否使用 list_append atomic 添加项目?

DynamoDB的常见问题解答说:

问:DynamoDB 是否支持就地原子更新?

Amazon DynamoDB 支持快速就地更新。您可以使用单个 API 调用增加或减少一行中的数字属性。同样,您可以自动添加或删除集合、列表或映射。查看我们的文档以获取有关原子更新的更多信息。

当您单击更多文档的链接时,它没有关于添加到集合的更多信息。

基于此,我认为使用ADD关键字添加到列表/集将是原子的。

但是使用该list_append函数添加到列表也是原子的吗?有没有关于此的其他文档?

0 投票
0 回答
55 浏览

php - 如何同步同一张表中的单元格值?

大问题...

我正在用 PHP 和 MySQL 实现一个在线售票系统。我有一个名为“block_of_tickets”的表,或者类似的东西......

此表如下所示:

在哪里:

  1. idblock:票块的id(主键)。
  2. block_name:块的名称。在示例中,我有一个“Block 1-M”和“Block 1-F”分别代表“Block 1 - Male”和“Block 1 - Female”。
  3. total_tickets:可用门票总数
  4. block_gender:票块的性别
  5. idblock_pair:当前块对的块。

注意:还有其他列,如“价格”等。

这是(大)问题:

  1. 当有“ idblock_pair ”时,这意味着两个票块将共享相同的total_tickets(可用票),因此在这种情况下两个单元格必须具有完全相同的值。正如您在上面的示例中看到的那样,块 1 指向块 2,反之亦然

  2. 很多人(几乎)同时购买了很多票,这意味着每张售出的票必须在两个单元格的“total_tickets”字段中减 1。

数据库规范化可以解决这个问题。但是,它会在性能上损失很多。

我几乎可以肯定我应该使用“SELECT ... FOR UPDATE”...但我不知道如何,因为它是同一张表,并且可能会发生“死锁”...

如何解决这个问题呢?我必须使用触发器吗?程序?我必须使用 PHP 处理(和事务)来解决这个问题吗?


在下面的示例中,售出了一张票,现在我将total_tickets减1:

这是一个很好的解决方案吗?

0 投票
1 回答
270 浏览

asp.net-core - EF Core + SignalR 多客户端:“无法回滚 - 没有事务处于活动状态”

我正在使用带有 SignalR 的 EFCore SQLite。

当有多个客户端同时连接时,数据库无法再更改(插入/更新),此异常抛出:“无法回滚 - 没有事务处于活动状态”

客户端与包含其信息的查询参数连接,然后:

  • 查看数据库,如果 clientName 存在,则更新其信息。否则,添加新的。
  • 连接后,客户端名称调用 GetData() 返回所有客户端信息等...
  • 大约有 100 个客户端同时连接。

日志:

然后

之后,当我尝试插入或更新内容时:

有解决方法吗?这仅发生在具有 50 个以上客户端的生产环境中,因此在开发时很难调试。

任何帮助将不胜感激!

0 投票
1 回答
80 浏览

sql - PL/SQL 程序数据冻结(保留随机乐透票)

我正在使用存储过程从 Available_Tickets 表中选择一个“随机”行,选择后如果用户喜欢该号码并购买票,该行将从表中删除。

我的程序如下所示:

如果用户同意返回的数字,则删除选定的行。我可以在执行第一个 select 语句后删除具有 max(id) 的行的最坏情况吗?

编辑1----SELECT尽管表中发生了变化,这两个语句会看到相同的数据吗?为什么?

0 投票
1 回答
84 浏览

mysql - 事务并发以防止读取旧版本的记录

假设我有一张名为tasks. 每个任务都有一个status. 我采取其中一项处于状态的任务To Manage,将其置于In Management状态,然后运行为其创建任务的过程(可能需要几秒钟才能完成)。

在执行结束时,任务可能会返回To ManageCompleted状态,这取决于程序是否必须再次运行。

现在假设有多个进程同时运行此活动,以便一起完成或以其他方式处理多个不同的任务。

我想确保两个进程不会同时管理同一个任务。为此,上述活动应在事务中执行:

我正在使用 MySql 数据库,表是 InnoDB,具有 READ COMMITTED 隔离级别:https ://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-isolation-levels.html

我们说To Manage状态中只有一项任务。如果两个进程(P1 和 P2)同时执行并且transaction A不存在,则可能会发生以下情况:

但是,操作 1-2-3 实际上是在事务中执行的,这种情况应该是不可能的。

  • 你能确认事实确实如此吗?
  • 我是否需要在执行LOCK操作 1 之前执行显式读取任务表并在操作 2 完成后释放它?
  • 我还应该做些什么来防止意外结果?

DB结构比上面描述的要复杂得多。当我更改任务状态时,我也会在另一个表上写入日志。这是由代码(模型类)本身完成的。我有任务表,task_status 表,任务上有一个外键,还有一个 task_status_change(即日志表)。每个 txn 执行 1 次读取(获取任务),2 次写入(更改状态和写入日志)。所以我需要执行与此类似的操作(伪代码):

正如我上面提到的,我使用的是 READ COMMITED 隔离级别。我试图同时启动两个进程,在同一个任务池上一起运行。

第一个进程选择的任务 ID(ID 和时间戳):

第二个进程选择的任务 ID(ID 和时间戳):

谢谢