问题标签 [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 投票
3 回答
1880 浏览

sql-server - 事务级别、nolock/readpast 和并发

我们有一个系统,从多个站点同时插入大量数据,同时还暴露了一个数据查询接口。架构看起来像这样(抱歉格式不好):

数据插入是在“同步”中完成的,就像这样(我们只将数据插入系统,我们从不更新)

查询是这样的(对于给定的站点,测量时间和数据类型)

我的问题是我们如何结合插入的事务级别和查询的 NOLOCK/READPAST 提示,以便:

  1. 我们在支持插入的同时最大化系统中的并发性(我们需要存储大量数据,每秒高达 2000 多条记录)
  2. 查询仅从“已提交”同步返回数据(我们不希望结果集包含半插入同步或由于锁跳过而包含一些跳过条目的同步)
  3. 我们不关心查询中是否包含“最新”数据,我们更关心一致性和响应能力,而不是“实时”和最新数据

这可能是非常矛盾的目标,并且可能需要高事务隔离级别,但我对所有技巧和优化感兴趣,以实现对插入和选择的高响应性。如果需要更多细节来消除更多调整和技巧,我将很乐意详细说明。

更新:只需为将来的回复添加更多信息。我们在最初具有 5+ TB 存储的 SAN 网络上运行 SQL Server 2005(可能在 6 个月内 2008)。我不确定 SAn 设置了哪种 RAID,以及我们有多少磁盘可用。

0 投票
2 回答
165 浏览

sql-server - 创建 1K 个 ID,为所有行分配一个 transactionID,同时考虑到并发性

  1. 客户端将向服务器请求 1K 行 ID。
  2. 我必须确保我们有 1K 个 ID,clientID = -1,如果没有,我必须在表中插入 1K 个新 ID。
  3. 然后我必须将那些 1K ID 与 clientID 链接起来
  4. 将保留的 1K ID 返回给客户端。

是否就像将所有这些包装到一个事务中一样简单?

0 投票
2 回答
1359 浏览

sqlite - SQLite 非独占保留锁?

我一直在研究提高我网站的 SQLite 性能,尤其是在事务方面。本质上,我正在寻找一种在进程中延迟数据库写入的方法,以便它们可以一次完成。但是,当我累积更新查询时,我希望其他进程能够读取和写入数据库,并且只有在进程中发出提交时才锁定文件以进行写入。

在查看文档时,似乎一旦在事务中发出更新命令,进程就会获得一个保留锁,这(如果我没记错的话)意味着任何其他尝试将更新查询添加到自己的事务的进程或者提交事务是无法这样做的,因此会阻塞,直到事务提交到带有锁的进程上。

我确信针对此特定功能有很好的数据完整性原因。我只能说,在我的情况下,同时执行这些更新没有危险。

一种解决方案是,在每个过程中,我可以在数组中累积我希望调用的查询文本,然后在我准备好编写时循环它,但我想知道是否有可能进行 SQLite 事务自动为我执行此操作。

更新:当我说“一次完成所有更新”时,我的意思是在 SQLite 中使用事务来仅获得一个独占锁并在每个进程中写入一次磁盘,而不是每个查询一次。这导致使用 SQLite 的速度提高 100 倍。

我已经进行了一些基本测试,似乎一旦您有多个进程向其事务添加查询,一旦您点击更新查询,该进程就会尝试获取 RESERVED 锁。由于只有一个进程可以拥有保留锁,这意味着任何其他尝试获取锁的进程都将阻塞,直到拥有锁的进程完成事务。

我承认这个问题可能是一个过早的优化,因为我还没有遇到任何性能损失,但是我已经运行了一些简单的测试,并且 100 个用户在我的机器上创建和运行一个包含 100 个查询的事务大约需要 4 秒。

0 投票
4 回答
13405 浏览

php - PHP 和并发文件访问

我正在用 PHP 构建一个小型 Web 应用程序,它将一些信息存储在纯文本文件中。但是,我的应用程序的所有用户在某个给定时间点和可能同时使用/修改此文本文件。

所以问题是。确保只有一个用户可以在任何给定时间点对文件进行更改的最佳方法是什么?

0 投票
2 回答
7671 浏览

c# - 打开文件进行共享写入

以下代码只是演示我的问题的简化示例:

这里的问题是通常只有一个条目进入文件,即使我调用该方法 10 次。该文件应打开以允许共享。据我所知,没有抛出异常。这是怎么回事?

在这个示例所覆盖的实际代码中,对 DoWork 的每次调用实际上都在一个单独的进程中,尽管测试表明结果是相同的——如果我可以在这里修复它,我可以在那里修复它。

0 投票
6 回答
18464 浏览

sql - 将数据库表用作作业队列(又名批处理队列或消息队列)的最佳方式

我有一个包含约 50K 行的数据库表,每行代表一项需要完成的工作。我有一个程序从数据库中提取工作,完成工作并将结果放回数据库。(这个系统现在正在运行)

现在我想允许一个以上的处理任务来完成工作,但要确保没有任务被完成两次(作为性能问题而不是这会导致其他问题)。因为访问是通过存储过程进行的,所以我目前的做法是用看起来像这样的东西替换所述存储过程

顺便提一句; 工人的任务可能会在获得工作和提交结果之间失去联系。此外,除非我把那部分搞砸(每分钟约 5 个工作),否则我不认为数据库会接近瓶颈

这有什么问题吗?有一个更好的方法吗?

注意:“数据库作为 IPC 反模式”在这里只是稍微恰当,因为

  1. 我没有做 IPC(没有生成行的进程,它们现在都已经存在)和
  2. 针对该反模式描述的主要抱怨是,当进程等待消息时,它会导致数据库上出现不必要的负载(在我的情况下,如果没有消息,一切都可以在完成后关闭)
0 投票
4 回答
5566 浏览

java - 当我对 List 进行排序时,它的迭代器会发生什么?

假设我有一个List对象和该列表的迭代器

现在我对列表进行排序java.util.Collections.sort()

  • 迭代器会发生什么?
  • 它的行为是否仍然被定义并且仍然可以使用?
  • 如果没有,我可以防止破坏列表的迭代器吗?

我知道,这个问题可以通过改变程序设计来规避,例如克隆列表,但我特别想知道 Java 的“官方”行为。

0 投票
10 回答
3274 浏览

java - Java 并发场景——我是否需要同步?

这是交易。我有一个包含我称之为“程序代码”的数据的哈希映射,它存在于一个对象中,如下所示:

我有很多很多阅读器线程,每个阅读器线程都会调用一次 getValidProgramCodes() ,然后将该哈希图用作只读资源。

到目前为止,一切都很好。这就是我们变得有趣的地方。

我想放入一个计时器,它每隔一段时间会生成一个新的有效程序代码列表(不管如何),并调用 setValidProgramCodes。

我的理论——我需要帮助来验证——是我可以继续按原样使用代码,而无需进行显式同步。它是这样的:在更新 validProgramCodes 时,validProgramCodes 的值总是好的——它是指向新哈希图或旧哈希图的指针。 这是一切都取决于的假设。 拥有旧 hashmap 的读者是可以的;他可以继续使用旧值,因为在他释放它之前不会被垃圾收集。每个读者都是短暂的;它很快就会死去,并被一个新的取而代之的人取代,后者将获得新的价值。

这个有水吗?我的主要目标是在绝大多数没有更新发生的情况下避免代价高昂的同步和阻塞。我们每小时只更新一次左右,读者不断地进进出出。

0 投票
6 回答
6115 浏览

asp.net - 单例与缓存 ASP.NET

我在.NET 中创建了一个注册表类,它是一个单例。显然,这个单例的行为就像它保存在缓存中一样(单例对象对每个会话都可用)。这是我应该将此单例添加到缓存中的好习惯吗?+ 我是否需要注意 GetInstance() 函数的并发问题?

0 投票
3 回答
1468 浏览

.net - 在单独的进程中运行 .net 代码

在与 Sharepoint 相关的模拟场景中,我需要在单独的进程中执行一些代码(该进程将在某个用户的上下文中运行)。我不想启动一个单独的应用程序,基本上我只想在一个方法上做一个“运行方式”。