我有一个父实体,需要进行并发检查(如下所示)
[Timestamp]
public byte[] RowVersion { get; set; }
Run Code Online (Sandbox Code Playgroud)
我有一堆客户机进程,它们从该父实体访问只读值,并主要更新其子实体。
约束
客户之间不应干涉彼此的工作(例如,更新子记录不应在父实体上引发并发异常)。
我有一个确实更新此父实体的服务器进程,在这种情况下,如果父实体已更改,则客户端进程需要抛出。
注意:客户端的并发检查是牺牲性的,服务器的工作流程是关键任务。
问题
我需要检查(从客户端进程中)父实体是否已更改,而没有更新父实体的行版本。
在EF中对父实体进行并发检查很容易:
// Update the row version's original value
_db.Entry(dbManifest)
.Property(b => b.RowVersion)
.OriginalValue = dbManifest.RowVersion; // the row version the client originally read
// …Run Code Online (Sandbox Code Playgroud) c# sql-server entity-framework database-concurrency entity-framework-6
根据参考文档,除了允许DEFERRABLE事务之外,READ ONLY事务标志是有用的吗?
SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY;
Run Code Online (Sandbox Code Playgroud)
除非事务也是SERIALIZABLE和READ ONLY,否则DEFERRABLE事务属性不起作用.当为事务选择所有这三个属性时,事务可能会在第一次获取其快照时阻塞,之后它可以在没有SERIALIZABLE事务的正常开销的情况下运行,并且没有任何可能导致序列化或被序列化取消的风险失败.此模式非常适合长时间运行的报告或备份.
数据库引擎是否为只读事务运行其他优化?
database postgresql transactions readonly database-concurrency
只是想通过大家来运行这个,看看是否有任何明智的想法,因为我已经用尽了所有的想法,经过一整天,晚上和早上的搜索.在并发使用(硒测试)时,我们遇到的问题总是围绕数据库连接,例如超时,丢弃/关闭连接,数据库服务器无法访问.
该问题似乎仅限于Azure,因为即使在指向同一数据库(SQL Azure)的相同代码上运行相同的selenium测试,我们还没有在本地遇到此问题,因此它会指出它出现问题SQL Azure中的数据库连接.到目前为止,我们尝试了以下内容:
更改了设计模式 - 我们甚至花了很长时间来实现工作单元设计模式,其中数据库连接在每个工作单元之后被启动和处理但是这导致了其他地方的延迟加载问题,将对象传递给方法并且它在这一点上,返工会过于庞大.
更改角色大小 - 我能想到的最后一件事就是在Windows Azure中存在任何隐式连接限制的情况下提升角色大小 - 目前正在进行部署,因此它仍有一半的可能性!
站点基础结构如下:
任何帮助将不胜感激.
更新:我们将VM大小提升到中等,它所做的只是意味着同一个问题花费的时间更长.
当问题开始发生时,团队成员注意到发生了以下异常:
InvalidOperationException:执行命令需要打开且可用的连接.连接的当前状态被破坏.
每当数据库被命中时(这不是特定于某个代码区域),就会发生这种情况.
我正在处理的应用程序当前要求我在20到30分钟的时间内多次递增属于DynamoDB中项目的属性.我一直在做一些关于DynamoDBs 条件写入和原子计数器的额外阅读
发电机中的原子计数器似乎是我需要的合理选择,但我确实担心数据的一致性,特别是在发电机等分布式数据库中,并且会发出数据的准确性.我期望API在高峰时刻受到重创,但我想避免与条件更新相关的性能问题.我想我想知道原子计数器对DynamoDB的可靠性以及如何使用dynamo正确实现它们.其他建议也欢迎.
不久前,我写了一个由多个用户用来处理交易创建的应用程序.我现在还没有完成开发一段时间,我不记得我是如何管理用户之间的并发性的.因此,我在设计方面寻求一些建议.
原始申请具有以下特征:
这就是我想知道的:
我是否认为我不应该关心每个应用程序与数据库的连接?考虑到每个单独存在一个单例,我希望每个客户端有一个连接没有问题.
我怎样才能防止访问的并发性?我想我应该在修改数据时锁定,但是不记得怎么做.
如何设置网格以便在我的数据库更新时自动更新(例如,由其他用户更新)?
预先感谢您的帮助!
这更像是一个知识共享帖子。
最近在我的一个项目中,我遇到了一个很常见的问题,但在我遇到它之前从未真正考虑过它。有许多解决方案可用,但不知何故我没有找到我正在寻找的解决方案,我将在这篇文章中分享。我相信你们中的许多人已经知道以下解决方案,但对于那些不知道的人来说,这绝对可以挽救生命。:-)
最近,我正在研究一个 Windows 服务。该服务应该将一些记录插入一个长期存在并被其他几个旧服务使用的表中。有一列(比如“ID”)保存一个整数值。将整数插入到该表中的逻辑(可能是几年前)如下所述:
逻辑:
代码
SELECT @value = [Value] from [dbo].[Table1] WHERE [Name] = @Name;
UPDATE [dbo].[ Table1] SET [Value] = @value +1 WHERE [Name] = @Name;
SELECT @value = @value+1;
Run Code Online (Sandbox Code Playgroud)
所使用的技术存在重大并发问题。
解决此类问题的最佳方法是什么 - 考虑到许多不同的应用程序/服务都提到了这一点?
我正在尝试开发一个预订系统,在检查其可用性后预订不同的资产。系统首先尝试从数据库读取记录并检查正在预订的插槽是否可用。如果是这样,系统会通过将新记录插入系统来为他们预订时隙。
现在的问题是,如果有多个用户请求预订,并且由于对 db 的多个请求可以交错,那么就有可能发生这种情况。
User 1 -> read request start
User 2 -> read request start
User 1 -> read request success (booking available)
User 2 -> read request success (booking available)
User 1 -> write a new record to the db (new booking)
User 2 -> write a new record to the db (new booking) but this conflicts with User 1.
Run Code Online (Sandbox Code Playgroud)
为了避免这种情况,我理想情况下甚至在读取操作开始之前就必须获取一个集合级锁,并且只有在最终写入完成后才释放锁。
我的理解正确吗?如果可以,这可以在 MongoDB 中完成吗?
非常欢迎使用 MongoDB、Mongoose 或@tsed/mongoose 的任何解决方案。
我正在编写一个同步软件,它将在一个DB中进行所有更改并将它们同步到另一个DB.为此我在表格中添加了T两列:
alter table T add LastUpdate rowversion, LastSync binary(8) not null default 0
Run Code Online (Sandbox Code Playgroud)
现在,我可以轻松选择自上次同步以来已更改的所有行:
select * from T where LastUpdate > LastSync
Run Code Online (Sandbox Code Playgroud)
但是在执行同步之后,我应该使两个字段相等.但是更新行也会更新时间戳,所以我必须这样做:
update T set LastSync=@@DBTS+1 where ID=@syncedId
Run Code Online (Sandbox Code Playgroud)
但我想知道 - 这总是有效吗?如果我读取了值,@@DBTS然后另一个用户设法在我的行提交之前的某个地方插入/更新一行,该怎么办?这是冒险的代码吗?如果是的话 - 它怎么能变得更好?
sql-server timestamp rowversion race-condition database-concurrency
我有一个如下所示的表:
game_stats表:
id | game_id | player_id | stats | (many other cols...)
----------------------
1 | 'game_abc' | 8 | 'R R A B S' | ...
2 | 'game_abc' | 9 | 'S B A S' | ...
Run Code Online (Sandbox Code Playgroud)
用户批量上传给定游戏的数据,一次提交两个玩家的数据.例如:
"game": {
id: 'game_abc',
player_stats: {
8: {
stats: 'R R A B S'
},
9: {
stats: 'S B A S'
}
}
}
Run Code Online (Sandbox Code Playgroud)
将此提交到我的服务器应该会产生第一个表.
当我再次提交相同的数据时(例如,使用修订版),我在控制器中执行的操作首先删除game_stats表中具有给定game_id的所有现有行,而不是更新现有行:
class GameStatController
def update
GameStat.where("game_id = ?", game_id).destroy_all
params[:game][:player_stats].each do |stats| …Run Code Online (Sandbox Code Playgroud) 我有两个线程在与表类似的表上运行并发更新:
CREATE TABLE T (
SEQ NUMBER(10) PRIMARY KEY,
VAL1 VARCHAR2(10),
VAL2 VARCHAR2(10)
)
Run Code Online (Sandbox Code Playgroud)
该表包含大量条目,其中的更新类似于:
UPDATE T SET VAL1 = ? WHERE SEQ < ?
UPDATE T SET VAL2 = ? WHERE SEQ = ?
Run Code Online (Sandbox Code Playgroud)
这两个语句都在两个不同的事务中运行,这都是JDBC批处理更新,每个批处理都有1000行。这样做时,我遇到了ORA-00060:在相当快地等待资源时检测到死锁。我假设这两个事务都会部分影响相同的行,因为这两个事务都设法将某些行锁定在另一行之前。
有没有一种方法可以通过使锁定成为原子来避免这种情况,或者我需要在两个线程之间引入某种形式的显式锁定?
c# ×2
concurrency ×2
database ×2
sql-server ×2
azure ×1
jdbc ×1
mongodb ×1
mongoose ×1
oracle ×1
postgresql ×1
readonly ×1
rowversion ×1
sql ×1
timestamp ×1
transactions ×1