标签: locking

关于 INSERT 并发到具有复合主键的表的最佳实践?

说我有表usersteamsteams_users结表(team_IDuser_ID/复合PK)。如果我想将用户添加到团队中,那么在性能/并发问题方面,最佳选择是什么?

选项1)

首先查询表并查看关系是否已经存在,如果它只是通知发出请求的用户。

选项 2)

插入时,使用WHERE EXISTS语法(第二个示例)。

选项 3)

将 Postgres 9.5 Beta 用于 UPSERT 功能。(我想在学校项目中使用 Beta 版本不是一个坏主意吗?)。

在并发方面,哪种选择最好。我对 SQL 不是很有经验(只是 CRUD 应用程序的标准内容)。但据我所知,在第一个选项中,另一个用户可以在查询联结表之后但在自己实际插入关系之前插入关系。我想不会有任何重复项,因为我在该联结表中有一个复合主键,但我觉得让它成为例外并继续是不好的做法。此外,在我当前的代码中,在这种情况下我会返回 500 http 状态(因为 db 异常),这似乎并不正确。

我读过我可以通过“锁定”数据库/表来部分解决上述问题,但我不知道这是否是正确的方法。

最后,我不知道第二个选项是否存在竞争条件。

postgresql concurrency locking relational-theory

5
推荐指数
1
解决办法
2104
查看次数

在并发调用中使用 CTE 和 OUTPUT 块进行更新

我遇到了死锁问题,所以我开始使用我在某处读到的这个 CTE 技巧。没有更多的僵局。

但是现在我添加的每个客户端都会减慢(阻止?)存储过程。例如,1 个客户端的 1-2 秒更新变为两个客户端的 2-4 秒。(这个简单的隐喻查询运行时间为 0.001 秒,但在少数客户之后达到 0.03 秒——所以这个问题与我的实际实现无关。)

是锁定问题吗?我需要将它包装在(某种)交易中吗?

WITH UpdateView AS (
    SELECT TOP 1 W.*
    FROM [WidgetSandbox].[dbo].[Widgets] W
    INNER JOIN [WidgetSandbox].[dbo].[Sizes] S ON W.SizeId = S.Id
    WHERE W.StatusId = @availableStatusId
    AND W.ColorCode = @colorCode
    ORDER BY S.DiameterInches
)

UPDATE UpdateView 
SET StatusId = @soldOutStatusId
OUTPUT INSERTED.Id INTO @outputIds;

SET @singleUpdatedId = (SELECT TOP 1 Id FROM @outputIds);

SELECT * FROM [WidgetSandbox].[dbo].[Widgets]
WHERE Id = @singleUpdatedId;
Run Code Online (Sandbox Code Playgroud)

我希望我能更好地了解具体问题是什么,但事实上我只是被卡住了......

DDL,如果有帮助:https : //gist.github.com/RobertBaldini/3740c7bb85eea47d7fe63cb8602ac2d6

回购:https : …

sql-server deadlock stored-procedures concurrency locking

5
推荐指数
1
解决办法
2576
查看次数

在回滚期间,锁升级是否反转

通常,SQL Server 会在更新期间获取锁。它还支持锁升级

锁升级是将许多细粒度锁转换为较少粗粒度锁的过程,减少系统开销的同时增加并发争用的概率。

在事务 ROLLBACK 期间,SQL Server 是否会降级锁,放回细粒度锁?

sql-server sql-server-2008-r2 rollback locking

5
推荐指数
1
解决办法
784
查看次数

重复键错误中的 MySQL 锁定

文档

如果发生重复键错误,则在重复索引记录上设置共享锁。如果另一个会话已经拥有排它锁,那么如果有多个会话尝试插入同一行,则使用共享锁可能会导致死锁。如果另一个会话删除该行,就会发生这种情况。

使用文档中的示例,

假设 InnoDB 表 t1 具有以下结构:

CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;
Run Code Online (Sandbox Code Playgroud)

现在假设三个会话依次执行以下操作:

第 1 节:

START TRANSACTION;
INSERT INTO t1 VALUES(1);
Run Code Online (Sandbox Code Playgroud)

第 2 节:

START TRANSACTION;
INSERT INTO t1 VALUES(1);
Run Code Online (Sandbox Code Playgroud)

第 3 节:

START TRANSACTION;
INSERT INTO t1 VALUES(1);
Run Code Online (Sandbox Code Playgroud)

第 1 节:

ROLLBACK;
Run Code Online (Sandbox Code Playgroud)

会话 1 的第一个操作获取该行的排它锁。会话 2 和 3 的操作都会导致重复键错误,并且它们都为该行请求共享锁。当会话 1 回滚时,它会释放它对该行的排它锁,并且会话 2 和 3 的排队共享锁请求被授予。此时,会话 2 和 3 死锁:由于对方持有共享锁,因此都无法获取该行的排他锁。

我有一些问题 :

1) 插入查询对其插入的行进行排他锁。因此,假设 T1 在第 1 行插入,它将锁定第 1 行。现在当 …

mysql transaction locking

5
推荐指数
1
解决办法
965
查看次数

SQL Server 中的 ODBC 连接锁定表

我们的 ERP 系统比现代系统稍差,后端目前安装在 SQL Server 2008 R2 上。我们通过管理授权(并非总是如此)允许许多用户随意从该系统中提取数据以将数据处理为他们喜欢的报告风格(BI、Powerquery、Access),这是完全不切实际的做法。 、Excel 等)

尽管所有这些报告生成用户都只有选择权限,但还有一些其他应用程序能够实际操作数据,以执行 EDI、自动数据输入等操作。

从逻辑上讲,这会在表上创建许多竞争条件。先到先得,或者更糟的是,仍在提供服务,请稍等,或者只是不......我相信这进一步导致了多年来无法解释的数据损坏需要供应商协助纠正。因为并非所有应用程序都经过正确编码以预测其他事物可能会中断其自己的私有意图的可能性。

因此,任务是在我最近才继承的系统上尽可能证明/纠正/减轻它。

我的第一直觉告诉我,如果没有不同供应商产品之间的某种 IPC/错误/事务控制以及他们修复它的意愿、控制源代码或限制它的能力,这是无法完成的,这不能从 DBA 修复从角度来看,这只是导致应该预期的潜在有害副作用的不良做法。

所以此时我所能做的就是证明这一点,看看如果有证据,我可以在坚持必须这样做的管理层心中征求某种行为改变。

第一步,我正在运行一个连续的分析器输出到磁盘,尽管资源密集,但我必须能够返回并查看已提交的内容,由谁提交,以及它产生了什么影响。我还使用 perfmon 日志记录和 PAL 来尝试交叉引用服务器上的密集行为,“当处理器和内存挂钩时,SQL 服务器在该实例中做了什么(很可能是为编写的 GUI 之一提供服务,性能不佳,十个表连接,非索引查询,一些报告编写者/工具扔在一起”

其中一种情况刚刚发生,我们在 ERP 系统中有一个用户无法执行某项功能,我们发现该用户登录的数据库没有使用 ERP 软件(使用 ODBC,SQL 用户只能选择访问,以及MS Access),让他们断开连接并完成该功能。管理层拒绝相信它们是相关的,因为它们“应该处理不同的表,而用户只有选择访问权限”,而且我没有发生之前瞬间的个人资料历史记录。

所以,这一切归结为一个问题,DBA学员在那里,给的任务验算该应用程序A被应用B的不利影响,你有什么建议给报价?

ms-access sql-server odbc sql-server-2008-r2 locking

5
推荐指数
1
解决办法
5468
查看次数

为什么在 SELECT 不插入时将 INSERT SELECT 插入不相关的表块?mysql 5.6

简而言之,我有一个表“app”,它有一个主要的自动增量字段 app_id,一个字段 created_at datetime 不为空。

我有另一个表“app_subset”,只有一个键“app_id”。

如果我运行这样的查询:

SELECT app_id FROM app;
Run Code Online (Sandbox Code Playgroud)

然后在运行时,我执行:

INSERT INTO app (created_at) VALUES (NOW());
Run Code Online (Sandbox Code Playgroud)

插入立即执行,而不是等待选择完成。

但是,如果我运行这样的查询:

INSERT IGNORE INTO app_subset SELECT app_id FROM app;
Run Code Online (Sandbox Code Playgroud)

然后在应用程序中运行相同的插入:

INSERT INTO app (created_at) VALUES (NOW());
Run Code Online (Sandbox Code Playgroud)

现在 INSERT INTO 应用程序查询阻塞,等待 INSERT IGNORE 完成。

我试图理解为什么会这样。我知道我的选择结果将被 INSERT INTO 应用程序更改,但似乎如果原始 SELECT 没有阻塞,那么使用该选择结果的 INSERT 也不应该阻塞。我希望能够以某种方式进行设置,以便以某种方式出现这种情况,或者至少完全理解为什么会发生这种情况,以便我可以预测将来会出现类似的问题。

从下面罗兰多的回答中,听起来 READ UNCOMMITED 应该可以工作,实际上当我执行时:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Run Code Online (Sandbox Code Playgroud)

INSERT IGNORE .. SELECT 不再导致我的 INSERT INTO 应用程序阻塞。

我很好奇是否有办法将它作为一行来做(比如:)

INSERT IGNORE INTO app_subset SELECT app_id FROM app LOCK IN …
Run Code Online (Sandbox Code Playgroud)

mysql innodb locking mysql-5.6

5
推荐指数
1
解决办法
5199
查看次数

如何以原子方式替换表数据的子集

在 PostgreSQL 9.6 我有一个T这样的表

category | id | data
---------+----+------
A        | 1  | foo
A        | 2  | bar
A        | 3  | baz
B        | 4  | eh
B        | 5  | whatcomesafterfoobarbaz
Run Code Online (Sandbox Code Playgroud)

有一个视图V为我提供了数据T,所以它有列category, id, dataT本质上是 的物化视图V,除了我需要以比“刷新所有内容”更多的粒度来刷新它。

所以我会选择V例如

SELECT * FROM V WHERE category = 'A';
Run Code Online (Sandbox Code Playgroud)

或者

SELECT * FROM V WHERE category = 'A' AND id = 2;
Run Code Online (Sandbox Code Playgroud)

T用任何data V …

postgresql concurrency locking update postgresql-9.6

5
推荐指数
1
解决办法
1136
查看次数

锁定特定表的事务

注意:如果有类似的问题,参考我。

我有两张桌子Request& Receipt

我希望表Receipt保持锁定状态,以便从任何地方进行 CRUD 操作,直到事务完成。我需要事务在存储过程中。

不可能吗?如何?

为什么要Receipt保持锁定状态? 导致内部的插入或删除请求Receipt将无法操作它!请注意,我需要从它的到它的每一个ReceiptId都是连续的!Requeststartfinish

细节

sql-server stored-procedures transaction locking

5
推荐指数
1
解决办法
300
查看次数

Microsoft SQL Server 是否提供像 Postgres 那样的咨询锁功能?

在 Postgres 中,Advisory Locks特性提供了在数据库服务器中集中管理的任意应用程序定义的锁。这些锁与表或行等无关。

Microsoft SQL Server 是否提供类似这些建议锁的功能?

sql-server locking

5
推荐指数
1
解决办法
774
查看次数

MS SQL Server 中应用锁的限制

Microsoft SQL Server 通过sp-getapplock命令和相关命令提供任意应用程序定义的锁定机制。

键, or resource_name,被指定为一个字符串,一个 varchar 255。但文档还提到键/名称是散列的。

所以这让我想知道:

  • 使用什么样的哈希函数?
  • 该散列函数的结果分布情况如何?
  • 我应该使用什么样的输入来扩大散列结果的分布,以尽量减少巧合碰撞的机会?
  • 我可以激活的应用锁数量的理论和实践限制是什么?
  • 应用锁使用哪些资源,例如内存量或内存限制?

我正在为特殊需求应用程序的许多表的行实施悲观锁定机制。作为我的应用锁键/名称,我计划使用一个代表每个表的数字与存储在每一行中的 ID 号相结合。示例键/名称可能类似于mydb_myschema_table0000000142_row0000241738. 我可能一次有许多活动,所以我需要了解这些限制。

sql-server locking limits

5
推荐指数
1
解决办法
2927
查看次数