Questions tagged «locking»

通过临时授予请求锁定的进程的独占访问权限来管理对共享数据或资源的并发访问的机制。

3
网络延迟增加会导致MS SQL Server中的表锁定吗?
如果我要通过高延迟网络对SQL Server数据库进行一次调用,是否会由于该延迟而发生表锁定?假设我查询表A以获得某些记录,并且SQL Server必须通过慢速网络返回该数据-服务器通过网络发送响应时,表A上是否存在读取锁,或者在发送之前SQL Server是否释放了锁响应? 另外,答案是否会根据回应的大小而有所不同?如果它只需要返回几KB与几百MB,那会有所作为吗? 创建一个显式事务,运行查询并关闭该事务显然会导致表锁定,因为事务的持续时间与我的等待时间相关。

5
数据库事务和锁定之间的确切关系是什么?
本着提高我的知识水平提出的一个谦虚的问题。请您反应温和。 作为长期的应用程序开发人员,我在某种程度上知道事务是什么(我一直都在使用它们)。暂时不考虑事务隔离级别,在较高的级别上,事务允许一个工作块完全或根本不完成,并允许与其他数据库修改活动进行一定程度的隔离。 我还知道什么是锁(在各种数据库中),或者至少是一种行为(如果我以某种方式明确地锁定了一个表,那么任何其他进程或线程都无法更新该表的任何内容)。 我现在最明显的不明确的是:在各种数据库中,当我明确地锁定一行或一台,我在用人所使用的数据库的交易设施在幕后进行交易正常工作完全一样的结构? 也就是说,对我来说,为了使事务是原子的和隔离的,它必须进行一些锁定。这种由事务启动,隐藏迁移的锁定是否与各种数据库允许我通过诸如SELECT FOR UPDATE或显式LOCK命令之类的构造访问的锁定相同?还是这两个概念完全不同? 再次,我为这个问题的天真道歉。我很高兴被告知更多的基础资料。

2
如何找到仍持有锁的查询?
查询sys.dm_tran_locksDMV将向我们显示哪些会话(SPID)持有对表,页面和行等资源的锁定。 对于获得的每个锁,是否有任何方法可以确定哪个SQL语句(删除,插入,更新或选择)导致了该锁? 我知道,most_recent_query_handle在列sys.dm_exec_connectionsDMV给了我们执行的最后一个查询的文本,而是多次其他查询同一个会话(SPID)在跑前和仍持有锁。 我已经使用了该sp_whoisactive过程(来自Adam Machanic),它仅显示了当前在输入缓冲区上的查询(认为DBCC INPUTBUFFER @spid),但并非总是(在我的情况下通常是)获取锁定的查询。 例如: 公开交易/会话 exec一条语句(持有资源锁) 在同一会话上执行另一条语句 打开另一个事务/会话,然后尝试修改在步骤2锁定的资源。 该sp_whoisactive过程将在第3步指出该语句,它不是锁的责任,因此无用。 这个问题来自使用“ 阻塞的流程报告”功能进行分析,以查找生产中阻塞方案的根本原因。每个事务都运行几个查询,大多数情况下,最后一个查询(显示在BPR的输入缓冲区上)很少是持有锁的查询。 我有一个后续问题:有效识别阻塞查询的框架

2
SQL Server中多个工作线程的FIFO队列表
我试图回答以下stackoverflow问题: 我应该使用哪种SQL Server 2005/2008锁定方法来处理多个服务器应用程序实例中的单个表行? 在发布一个有点天真的答案之后,我想我会把钱放在嘴边,实际上 测试我所建议的方案,以确保我不会像往常一样追逐OP。好吧,事实证明,这比我想象的要难得多(我敢肯定,这对任何人来说都不奇怪)。 这是我尝试过并想到的: 首先,我尝试使用派生表中的ORDER BY进行TOP 1 UPDATE ROWLOCK, READPAST。这产生了死锁,并且还处理了乱序的项目。它必须尽可能接近FIFO,以排除需要多次尝试处理同一行的错误。 然后,我尝试选择所需的下一个QueueID到一个变量,使用的各种组合READPAST,UPDLOCK,HOLDLOCK,并ROWLOCK专门由会话保持了更新的行。我尝试过的所有变体都遇到了与以前相同的问题,并且对于与的某些组合READPAST,抱怨如下: 您只能在READ COMMITTED或REPEATABLE READ隔离级别中指定READPAST锁。 这是令人困惑的,因为它是“已提交读”。我以前遇到过这个问题,这令人沮丧。 自从我开始写这个问题以来,Remus Rusani发布了一个新的问题答案。我阅读了他的链接文章,看到他正在使用破坏性读取,因为他在回答中说“在网络通话期间实际上不可能保持锁定状态”。在阅读了他的文章中有关热点和需要锁定才能进行任何更新或删除的页面的内容后,我担心即使我能够算出正确的锁定来执行我想要的操作,也无法扩展并且可能无法处理大量并发。 现在,我不确定该去哪里。是真的无法实现在处理行时维持锁定(即使它不支持高tps或大量并发)吗?我想念什么? 希望比我更聪明的人和比我更老练的人可以提供帮助,以下是我使用的测试脚本。它又切换回TOP 1 UPDATE方法,但是我也将另一种方法留在其中,注释掉,以防您也想探索一下。 将这些粘贴到单独的会话中,运行会话1,然后快速将所有其他会话粘贴。在大约50秒内,测试将结束。查看每个会话中的消息,以查看其所做的工作(或失败的方式)。第一个会话将显示一个带有快照的行集,第二个快照详细描述了存在的锁和正在处理的队列项。有时它可以工作,而其他时候则根本不工作。 第一场 /* Session 1: Setup and control - Run this session first, then immediately run all other sessions */ IF Object_ID('dbo.Queue', 'U') IS NULL CREATE …

2
大量INSERT阻止SELECT
我遇到大量阻止SELECT操作的INSERT问题。 架构图 我有一个这样的表: CREATE TABLE [InverterData]( [InverterID] [bigint] NOT NULL, [TimeStamp] [datetime] NOT NULL, [ValueA] [decimal](18, 2) NULL, [ValueB] [decimal](18, 2) NULL CONSTRAINT [PrimaryKey_e149e28f-5754-4229-be01-65fafeebce16] PRIMARY KEY CLUSTERED ( [TimeStamp] DESC, [InverterID] ASC ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = …

1
更改nvarchar列的大小时,是否需要删除唯一索引?并且在重新创建索引时表会被锁定吗?
在我们的数据库中,存在一个或多或少如下所示的大表: CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); 但是现在串行字段的大小已经变小,因此我想将其更改为32。VisualStudio架构比较工具建议通过以下方式进行操作: DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); 这真的需要吗?还是更像是一种超级节省的方式? 另外,当重新创建唯一索引时,我的表会被锁定吗?因为这将是一个大问题(因为该表具有3000万行,我想重新创建索引将花费相当长的时间),因为下一个维护窗口将在未来几个月内进行。我有什么选择?


1
为什么此RX-X锁没有出现在扩展事件中?
问题 我有一对可串行隔离的查询,它们导致RX-X锁定。但是,当我使用扩展事件来观察锁获取时,RX-X锁获取从未出现,它仅被释放。它从何而来? 再现 这是我的桌子: CREATE TABLE dbo.LockTest ( ID int identity, Junk char(4) ) CREATE CLUSTERED INDEX CX_LockTest --not unique! ON dbo.LockTest(ID) --preload some rows INSERT dbo.LockTest VALUES ('data'),('data'),('data') 这是我的问题批次: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRAN INSERT dbo.LockTest VALUES ('bleh') SELECT * FROM dbo.LockTest WHERE ID = SCOPE_IDENTITY() --ROLLBACK …

2
如何获取SQL插入和/或更新以不锁定MS SQL Server上的整个表
数据库工作非常新手,因此,感谢您对一个基本问题的耐心等待。我在本地计算机上运行SQL Server 2014,并且有一个小表和一个基本的客户端应用程序来测试不同的方法。我在INSERT INTO和UPDATE语句中都得到了一个表锁。客户端是具有以下代码的ASP.NET应用程序: OleDbConnection cn = new OleDbConnection("Provider=SQLNCLI11; server=localhost\\SQLEXPRESS; Database=<my db>; user id=<my uid>; password=<my pwd>"); cn.Open(); OleDbTransaction tn = cn.BeginTransaction(); OleDbCommand cmd = new OleDbCommand("INSERT INTO LAYOUTSv2 (LAYOUTS_name_t, LAYOUTS_enabled_b, LAYOUTS_data_m) VALUES ('name', '-1', 'data')", cn, tn); cmd.ExecuteNonQuery(); cmd.CommandText = "SELECT SCOPE_IDENTITY()"; int newkey = Decimal.ToInt32((decimal)cmd.ExecuteScalar()); Console.WriteLine("Created index " …

4
InnoDB行锁定-如何实现
我一直在四处逛逛,阅读mysql站点,但仍然看不到它是如何工作的。 我想选择结果并对其行锁定以进行写入,写入更改并释放锁定。audocommit已开启。 方案 id (int) name (varchar50) status (enum 'pending', 'working', 'complete') created (datetime) updated (datetime) 选择状态为待定的项目,然后将其更新为工作状态。使用排他性写入来确保同一物品不会被拾取两次。 所以; "SELECT id FROM `items` WHERE `status`='pending' LIMIT 1 FOR WRITE" 从结果中获取ID "UPDATE `items` SET `status`='working', `updated`=NOW() WHERE `id`=<selected id> 我是否需要做任何事情来释放锁,它是否像我上面所做的那样工作?
13 mysql  innodb  locking 


1
为什么UPDLOCK导致SELECT挂起(锁定)?
我在SQL SERVER中有一个选择可以锁定整个表。 这是设置脚本(请确保您不覆盖任何内容) USE [master] GO IF EXISTS(SELECT 1 FROM sys.databases d WHERE d.name = 'LockingTestDB') DROP DATABASE LockingTestDB GO CREATE DATABASE LockingTestDB GO USE [LockingTestDB] GO IF EXISTS(SELECT 1 FROM sys.tables t WHERE t.name = 'LockingTestTable') DROP TABLE LockingTestTable GO CREATE TABLE LockingTestTable ( Id int IDENTITY(1, 1), Name …

2
SQL Server索引更新死锁
我有2个查询,当同时运行时会导致死锁。 查询1-更新索引(index1)中包含的列: update table1 set column1 = value1 where id = @Id 在table1上获取X-Lock,然后在index1上尝试X-Lock。 查询2: select columnx, columny, etc from table1 where {some condition} 在index1上获取S-Lock,然后在table1上尝试S-Lock。 有没有办法在保持相同查询的同时防止死锁?例如,我是否可以在更新之前以某种方式对更新事务中的索引进行X锁定,以确保表和索引访问的顺序相同-这样可以防止死锁? 隔离级别为“已提交读”。已为索引启用行锁和页锁。同一条记录可能同时参与这两个查询-从死锁图中我看不出来,因为它没有显示参数。 死锁图

1
使用非聚集索引更新不同行时出现死锁
我正在解决一个死锁问题,但我发现在id字段上使用聚集索引和非聚集索引时,锁的行为有所不同。如果将聚集索引或主键应用于id字段,则似乎可以解决死锁问题。 我有不同的事务对一个不同的行进行一个或多个更新,例如事务A将仅更新ID = a的行,事务B将仅触摸ID = b的行,等等。 而且我知道没有索引,更新将获取所有行的更新锁,并在必要时隐式转换为排他锁,这最终将导致死锁。但是我无法找出为什么非聚集索引仍然存在死锁(尽管命中率似乎下降了) 数据表: CREATE TABLE [dbo].[user]( [id] [int] IDENTITY(1,1) NOT NULL, [userName] [nvarchar](255) NULL, [name] [nvarchar](255) NULL, [phone] [nvarchar](255) NULL, [password] [nvarchar](255) NULL, [ip] [nvarchar](30) NULL, [email] [nvarchar](255) NULL, [pubDate] [datetime] NULL, [todoOrder] [text] NULL ) 死锁跟踪 deadlock-list deadlock victim=process4152ca8 process-list process id=process4152ca8 taskpriority=0 logused=0 …

2
如何在MySQL中正确实现乐观锁定
如何正确地在MySQL中实现乐观锁定? 我们的小组推断出我们必须执行下面的#4,否则就有另一个线程可以更新相同版本的记录的风险,但是我们想验证这是最好的方法。 在要使用乐观锁定的表上创建一个版本字段,例如列名=“ version” 在选择时,确保包括版本列并记下版本 在对记录进行后续更新时,更新语句应发出“ where version = X”,其中X是我们在#2中收到的版本,并将该更新语句中的version字段设置为X + 1 SELECT FOR UPDATE对我们将要更新的记录执行a ,以便我们序列化可以更改我们要更新的记录的人员。 为了澄清起见,我们试图防止两个线程在同一时间窗口中选择同一条记录(如果它们试图同时更新记录)在它们捕获相同版本的记录时彼此覆盖,因此它们将无法覆盖彼此。我们认为,除非我们执行#4,否则如果两个线程同时输入各自的事务(但尚未发布其更新),则有机会在它们进行更新时,将使用UPDATE的第二个线程...其中version = X将对旧数据进行操作。 我们是否正确地认为即使使用版本字段/乐观锁定,更新时也必须执行这种悲观锁定?
13 mysql  locking 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.