标签: locking

如何在 MySQL 中交换表?

假设,我有一个 table foo,其中包含一些不时计算的统计信息。它被其他查询大量使用。

这就是为什么我想计算更多最近的统计数据foo_new并在计算准备好时交换它们。

我可以

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;
Run Code Online (Sandbox Code Playgroud)

但是如果在foo没有表的情况下查询需要这两行之间的表会发生foo什么?我想我必须以某种方式锁定它……或者还有其他方法可以做到吗?

mysql alter-table locking

61
推荐指数
1
解决办法
3万
查看次数

什么是锁升级?

我在面试中被问到这个问题,但没有答案。这里有人能解释一下吗?

sql-server lock-escalation locking

52
推荐指数
4
解决办法
5万
查看次数

PostgreSQL 中并发 DELETE / INSERT 的锁定问题

这很简单,但我对 PG 所做的(v9.0)感到困惑。我们从一个简单的表开始:

CREATE TABLE test (id INT PRIMARY KEY);
Run Code Online (Sandbox Code Playgroud)

和几行:

INSERT INTO TEST VALUES (1);
INSERT INTO TEST VALUES (2);
Run Code Online (Sandbox Code Playgroud)

使用我最喜欢的 JDBC 查询工具 (ExecuteQuery),我将两个会话窗口连接到该表所在的数据库。它们都是事务性的(即 auto-commit=false)。我们称它们为 S1 和 S2。

每个相同的代码位:

1:DELETE FROM test WHERE id=1;
2:INSERT INTO test VALUES (1);
3:COMMIT;
Run Code Online (Sandbox Code Playgroud)

现在,以慢动作运行它,在窗口中一次执行一个。

S1-1 runs (1 row deleted)
S2-1 runs (but is blocked since S1 has a write lock)
S1-2 runs (1 row inserted)
S1-3 runs, releasing the write lock
S2-1 runs, now that it can get the lock. But reports …
Run Code Online (Sandbox Code Playgroud)

postgresql concurrency locking serialization

38
推荐指数
4
解决办法
3万
查看次数

NOLOCK 总是不好?

我是一名报表开发人员,希望尽可能提高我的查询效率。我曾经与一位 DBA 一起工作,他告诉我 - 我相信是因为我总是在生产服务器上处理报告 -NOLOCK在每个查询中使用。

现在,我与一个NOLOCK在任何情况下都被禁止的 DBA 一起工作- 即使我的报告(由于几个表上缺乏索引)正在停止复制和系统更新。在我看来,在这种情况下,aNOLOCK将是一件好事。

由于我的大部分 SQL 培训都是来自不同意见的 DBA,因此我想向各种各样的 DBA 提出这个问题。

sql-server locking nolock

34
推荐指数
4
解决办法
4430
查看次数

如何判断一个Oracle表是否被锁定?

我们一直在使用安装在 Oracle Enterprise 11gR2 上的 BI 软件和存储库数据库。

其中一些批处理报告将尝试访问可能仍被锁定的数据库表。如何确定 Oracle 表是否已锁定?是否有任何 SQL 语句显示像历史详细信息以供分析?

oracle-11g-r2 business-intelligence locking

34
推荐指数
3
解决办法
58万
查看次数

将列添加到生产表

将列添加到 SQL Server 2008 R2 上的大型生产表的最佳方法是什么?根据微软的在线书籍:

ALTER TABLE 中指定的更改会立即实施。如果更改需要修改表中的行,则 ALTER TABLE 更新行。ALTER TABLE 获取表上的模式修改锁,以确保在更改期间没有其他连接引用甚至表的元数据,除了在最后需要非常短的 SCH-M 锁的在线索引操作。

(http://msdn.microsoft.com/en-us/library/ms190273.aspx)

在包含数百万行的大表上,这可能需要一段时间。停电是唯一的选择吗?处理这种情况的最佳方法是什么?

sql-server sql-server-2008-r2 alter-table locking

30
推荐指数
2
解决办法
3万
查看次数

我可以依赖按顺序读取 SQL Server 标识值吗?

TL;DR:下面的问题归结为:插入行时,在生成Identity值和锁定聚集索引中的相应行键之间是否存在机会窗口,外部观察者可以在其中看到更新的值 Identity并发事务插入的值?(在 SQL Server 中。)

详细版

我有一个 SQL Server 表,其中有一个Identity名为的列CheckpointSequence,它是该表的聚集索引(它还具有许多其他非聚集索引)的键。行由多个并发进程和线程(在隔离级别和没有)插入到表中。同时,有进程定期从聚集索引中读取行,按该列排序(也在隔离级别,关闭该选项)。READ COMMITTEDIDENTITY_INSERTCheckpointSequenceREAD COMMITTEDREAD COMMITTED SNAPSHOT

我目前依赖于读取过程永远不能“跳过”检查点的事实。我的问题是:我可以依赖这个属性吗?如果没有,我该怎么做才能使它成为现实?

示例:当插入标识值为 1、2、3、4 和 5的行时,读者在看到值为 4 的行之前不得看到值为 5 的行。测试表明该查询包含一个ORDER BY CheckpointSequence子句 (和WHERE CheckpointSequence > -1子句),当第 4 行被读取但尚未提交时可靠地阻塞,即使第 5 行已经提交。

我相信至少在理论上,这里可能存在竞争条件,可能会导致这个假设被打破。不幸的是,Identity关于Identity在多个并发事务的上下文中如何工作的文档并没有太多说明,它只说“每个新值都是基于当前的种子和增量生成的”。和“特定事务的每个新值都不同于表上的其他并发事务。” (微软)

我的推理是,它必须以某种方式工作:

  1. 事务开始(显式或隐式)。
  2. 生成身份值 (X)。
  3. 根据标识值在聚集索引上获取相应的行锁(除非锁升级开始,在这种情况下整个表都被锁定)。
  4. 该行已插入。
  5. 事务被提交(可能在很长时间之后),所以锁被再次移除。

我认为在第 2 …

sql-server concurrency identity locking

27
推荐指数
3
解决办法
4875
查看次数

使用 SELECT-UPDATE 模式时管理并发

假设您有以下代码(请忽略它很糟糕):

BEGIN TRAN;
DECLARE @id int
SELECT @id = id + 1 FROM TableA;
UPDATE TableA SET id = @id; --TableA must have only one row, apparently!
COMMIT TRAN;
-- @id is returned to the client or used somewhere else
Run Code Online (Sandbox Code Playgroud)

在我看来,这不是正确管理并发性。仅仅因为您有一个事务并不意味着其他人不会读取您在获取更新语句之前所做的相同值。

现在,让代码保持原样(我意识到这作为单个语句更好地处理,甚至使用自动增量/标识列更好)有哪些确定的方法可以使其正确处理并发并防止允许两个客户端获得相同条件的竞争条件身份证价值?

我很确定将 a 添加WITH (UPDLOCK, HOLDLOCK)到 SELECT 会解决问题。该SERIALIZABLE事务隔离级别(因为它拒绝任何人阅读你做了什么,直到移植是在将似乎工作,以及UPDATE:这是假见马丁的答案)。真的吗?它们会同样有效吗?一个比另一个更受欢迎吗?

想象一下做一些比 ID 更新更合法的事情——一些基于你需要更新的读取的计算。可能涉及许多表,其中一些您会写入,而另一些则不会。这里的最佳做法是什么?

写完这个问题后,我认为锁定提示更好,因为这样你只锁定了你需要的表,但我很感激任何人的意见。

PS 不,我不知道最好的答案,真的很想得到更好的理解!:)

sql-server concurrency locking isolation-level

26
推荐指数
3
解决办法
1万
查看次数

如何取消 SQL Server 中的应用锁定请求?

sp_getapplock存储过程有以下返回值:

0:同步成功授予锁。
1:等待其他不兼容的锁释放后,成功授予锁。
-1:锁定请求超时。
-2:锁定请求被取消。
-3:锁定请求被选为死锁牺牲品。
-999:表示参数验证或其他调用错误。

我正在编写一个用于调用sp_getapplock我们的数据访问层的包装器,我想知道在什么情况下可以返回 -2,以便我可以抛出一个描述性和有用的异常。-1 和 -3 的返回值的含义很明显,我可以轻松创建导致返回这些值的测试条件。我将如何设法获得 -2 的返回值?

sql-server locking

25
推荐指数
1
解决办法
2476
查看次数

证明在每个查询中不使用 (nolock) 提示

您是否曾经不得不证明不使用查询提示是合理的?

WITH (NOLOCK)在每个访问非常繁忙的服务器的查询中都看到了。开发人员认为它应该默认开启,因为他们讨厌在他们的代码中看到它数千次。

我试图解释说它允许脏读,最终它们会得到坏数据,但他们认为性能权衡是值得的。(他们的数据库一团糟;难怪他们有性能问题。)

如果你有一个明确的例子来说明如何反对这种滥用NOLOCK提示的情况,那将不胜感激。

sql-server locking nolock

23
推荐指数
3
解决办法
4972
查看次数