问题标签 [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.
c# - DataTable与MySQL数据库同步两种方式
我有一个 DataSet/DataTable,我想将更改写入 MySQL 数据库,如果 MySQL 数据库中有任何更改,请将这些更改写回我的 DataSet/DataTable。
简而言之:
myDataSet -> MySQL 数据库(用户编辑值)
myDataSet <- MySQL 数据库(另一个用户编辑了 MySQL 数据库)
从 MySQL 数据库中填充 DataSet 是这样完成的:
更新表中的值,为表设置了 Row_Changed EventHandler:
我打电话的地方:
要更新我使用的 MySQL 数据库:
这行得通。现在我想更新本地表中远程 MySQL 数据库的更改。据我所知,没有此命令,并且 mysqlDataAdapter.Update 不会将更新返回到我的表,只有本地表-> MySQL 数据库。
所以我编写了一个函数,它每 30 秒获取一次表格并进行比较。然后我将更改写入我的 dsTable。那行得通,但是下次我调用 UpdateTable() 时,我得到了错误:
并发冲突:UpdateCommand 影响了预期的 1 条记录中的 0 条。System.Exception {System.Data.DBConcurrencyException}
我不知道为什么。当我从用户界面更新单个值时,我也会更改 dsTable 中的单元格。
当我调用 mysqlDataAdapter.Fill(dsTable, tablename) 我的 datagridview 在无限循环中刷新。
我现在被困住了。有什么好的方法吗?
android-syncadapter - Android SyncAdapter 和并发写访问
我正在使用 SyncAdapter 开发一个 RESTful Android 应用程序。我观看了一些截屏视频并阅读了一些教程,但它们仅涉及基本动态。在开始编写代码之前,我想尝试从专家用户那里获得有关并发问题的反馈。
步骤 1. 用户在数据库表中U
插入一个新条目。该条目有一列。E
T
status = TO_SYNC
E
步骤 2. 在同步条目之前,U
决定对其进行修改。一个活动A
开始用于修改 的列值E
。
步骤 3. 当用户修改条目时,SyncAdapter 启动并将条目发送status == TO_SYNC
到服务器。对于每个条目,一旦收到来自服务器的肯定回答,就会设置SyncAdapter
。status = SYNCED
第 4 步。假设对同一条目的并发访问E
会导致冲突:
- SyncAdapter 读取
E
,发送E
到服务器 - 活动
A
完成并将E
状态设置为TO_SYNC
- SyncAdapter 从服务器接收到 ok 并将
status
of设置E
为SYNCED
- 此时
E
将不会同步 的新值,因为该值TO_SYNC
已被 SyncAdapter 覆盖。
我的问题是:如何在不阻塞整个数据库的情况下避免这样的问题,begin/end transaction
同时同步(这可能需要很长时间才能完成)?我应该在单个条目上使用经典的 java 锁吗?有没有更优雅的方式?
ruby-on-rails-3 - 如何处理删除和创建相同行的并发请求?
我有一个如下所示的表:
game_stats 表:
用户批量上传给定游戏的数据,同时提交两个玩家的数据。例如:
将此提交到我的服务器应该会生成第一个表。
当再次提交相同的数据(例如,带有修订)时,我没有更新现有行,而是首先删除game_stats
表中具有给定游戏 ID 的所有现有行:
这适用于单线程或单进程服务器。问题是我正在运行 Unicorn,它是一个多进程服务器。如果两个请求同时进入,我会得到一个竞争条件:
结果:具有相同数据的多个 game_stat 行。
我相信以某种方式锁定行或表是防止同时进行多个更新的方法——但我不知道该怎么做。与事务结合似乎是正确的做法,但我真的不明白为什么。
编辑
澄清为什么我不知道如何使用锁定:我不能一次锁定一行,因为该行只是被删除而不是修改。
c# - 从多个线程修改实体框架实体
我有一个 UI 线程,它使用户能够设置实体的某些属性。
我还有工作线程,它们会自动修改实体的属性,重要的是,用户无权访问。
每个线程都有不同的内容是否安全,DbContexts
并且只依赖于我的编程来始终避免修改相同的属性,然后尝试SaveChanges()
在以不同方式修改相同实体的上下文上进行操作?
或者有没有一种更安全的方法来做到这一点,即程序员有可能在某一天更改代码,以便从两个不同的上下文安全地修改相同的属性?还是后一种情况只是程序员必须小心/重构的一种情况?
event-sourcing - DocumentDB 唯一的并发插入?
我有一个使用 Azure 服务总线主题和服务总线队列运行的水平事件源驱动应用程序。我的所有服务器都通过主题接收了一些用于建立我的域模型状态的事件,而队列中的事件(接收频率更高且不改变域模型状态的事件)在服务器之间分发,以便分发加载。
现在,每次我的一个服务器通过队列或主题接收到一个事件时,它都会将它存储在一个 DocumentDB 中,用作事件存储。
现在问题来了。如何确定同一个文档不会被插入两次?假设 3 个服务器接收相同的事件。他们都试图存储它。如果他们决定同时执行所有操作,我怎样才能使其失败 2 台服务器?是否可以在 DocumentDB 中设置任何形式的唯一约束或某种事务范围以防止文档被插入两次?
sql-server - 当大量用户需要数据库中的同一张表(同时访问一个表)时,这是否很危险?
我使用服务器代码,通过将一些个人数据放入数据库表来为每个用户提供服务。有很多用户,例如其中两个想要将一些数据放在数据库中的表中。在这种情况下 sql server 将如何执行?是否有任何机制为此类用户的行为(同时访问表)做好准备?服务器的功能是用 C# 编写的,每次访问尝试都使用 SqlConnection.ConnectionString。
xquery - BaseX 如何处理并发?
我正在考虑使用 BaseX 作为更灵活的数据库。
它如何处理数据库并发?它在 Web 应用程序场景中如何工作,其中两个不同的用户可以更新相同的数据并有效地获得“脏读”?
django - Django 数据库并发问题
我在 Web api 中有一个“单一”方法,可以进行两次数据库调用
- 使用 count() 确保特定对象不存在
- 如果对象不存在,则保存它
这里的逻辑显然不是保存已经存在的对象。很简单。当重复的对象开始出现在 db 表中时,问题就来了。然后我意识到我无法控制糟糕的客户呼叫(同时重复呼叫)。
因此,当对该方法的第二次调用恰好发生在具有相同参数(相同对象)的代码块 1) 和 2) 之间时,就会出现问题:
- 调用 1 => count() == 0
- 调用 2 => count() == 0(它是 0,因为此时第一次调用没有完成处理和保存对象)
- 调用 1 => 保存对象
- 调用 2 => 保存对象,因为 count() == 0
错误的结果 => 我的表有两行具有相同的值
因此,在“Call 1”代码块完成之前,我不需要处理“Call 2”。
我一直在研究这个很多。一个选项会阻止我正在查询的表,直到方法完成执行(但这会给等式带来新的问题)。
其他人正在谈论使用原子事务,但我不明白如果另一个调用同时运行会有什么帮助。
另一种可能的解决方案是使用 unique_together 所以不可能创建具有相同值的两行(我开始认为这将是最好的选择)
我迷失在茫茫荒野中,试图弄清楚如何解决这个问题。鉴于这个问题很难测试,我想先在这里问。也许我只是错过了一些明显简单的东西......
澄清一下,这就是我判断对象是否已经存在的方式:
有任何想法吗?
sql - 在 sql 中创建/删除全局临时表时,用户之间是否存在访问冲突?
我有一个应该由多个用户执行的 SQL 存储过程。每个用户都将在同一服务器和同一数据库上执行此过程。在执行期间,它将创建全局临时表并在最后删除它们(例如##temp_1
,、、##temp_2
等)。当 proc 创建全局临时表时,它使用以下代码:
所以我的问题是,当User A
创建##temp_1
and时##temp_2
,User B
在另一台机器上启动并开始创建他的##temp_1
. 根据上面的代码,##temp_1
如果存在就会从数据库中删除。这个操作会影响User A
吗?如果用户相互影响,有没有办法避免呢?
非常感谢。
mysql - SQL:试图了解如何使用安全的并发访问和修改数据库
所以,我目前正在使用 MySQL,但任何 SQL 答案都可能会,因为我试图理解一般概念。
所以线程安全在并发环境中显然很重要。我主要使用 Java 进行编程,并且我总是非常小心地编写代码来保护其可变状态以避免线程冲突。
但是,在 SQL 中,我对如何实现同样的安全级别感到非常困惑。所以我要从我不知道的东西开始,继续我感到困惑的东西,然后从那里开始。
首先,我所知道的是交易。禁用自动提交、使用保存点、回滚等。据我了解,事务在提交时是原子的。
但我也看到了对显式锁定语句和并发模型(乐观、悲观)的引用。而且我真的不知道所有这些都适合。我也不想只对所有事情都使用事务并假设它是安全的。除非我完全理解它,否则我不会编写代码,我不想留下任何机会。
此外,触发器、过程等呢?如何将它们与事务一起使用?我如何确保那里的原子性?
我觉得我有点过于复杂了,但我正在寻找一个全面、明确的解释,以说明如何确保多个线程和用户可以安全地修改数据库。不完全是 ELI5,因为我对 SQL 的理解比这更好,但它真正彻底地解释了这个过程。
谢谢。在我的搜索中,我没有在此站点上找到与此问题相匹配的匹配项,但如果它是重复的,我深表歉意,并要求在锁定此问题之前提供指向适当答案的链接。