标签: locking

更新会锁定该行还是整个表?

基本问题:当我更新数据库表中的一行时,它会锁定当前行还是整个表?

我正在使用MySQL。当我更新不唯一的列时。

一种数据库引擎与另一种数据库引擎的锁定是否不同?我读过这篇文章,但我仍然很困惑。

mysql locking update

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

在 SQL Server / Azure SQL 中,有没有办法查看查询生成或想要生成的锁?

我正在尝试调查锁定情况。我知道如何通过查询查看数据库上的当前锁,sys.dm_tran_locks但我想要的是采用特定的 SQL 查询并对其进行某种“分析”以计算它将生成哪些锁。就像锁的执行计划一样?

这也可以是我运行查询然后查看生成了哪些锁的一种方式,对我来说这是一样的。我只需要一种方法来记录/查看生成的日志,因为我目前只能看到所持有的“实时”锁。

我特别需要尽可能多地了解这些锁的详细信息:类型、模式、它所持有的对象等。

我在 Azure SQL 数据库上。

sql-server azure-sql-database locking

4
推荐指数
1
解决办法
4750
查看次数

是否有可能在 PostgreSQL 中永远不运行 Vacuum Full

由于aVACUUM FULL锁表,这对于我们的生产环境来说是不可接受的。

是否可以只在生产系统上运行VACUUM而不运行?VACUUM FULL

是否可以VACUUM让空间重新用于新的INSERT用途?

postgresql locking vacuum

4
推荐指数
1
解决办法
3946
查看次数

阻塞总是意味着打开事务吗?

这似乎是一个有点无聊的问题,但是阻塞是否总是意味着有打开的事务并且可能导致事务日志增长到无穷大,因为打开的事务阻止了日志截断(SIMPLE 模式下的数据库)?

sql-server-2008 sql-server transaction locking transaction-log

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

在 READ COMMITTED 事务块中使用 (NOLOCK)

我们使用的是 SQL Server 2000。

我想知道如果我们NOLOCKREAD COMMITTED事务块中使用提示会有什么风险,例如:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
IF EXISTS(SELECT * FROM clients (NOLOCK) WHERE clientID = 23249)
    BEGIN
        PRINT 'TODO Update client'
    END
ELSE
    BEGIN
        PRINT 'TODO Insert client'
    END

COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

我担心的是,尽管事务块具有隔离级别,但 NOLOCK 提示将允许进行 ditry 读取。

这可能吗?

PS:我知道关于为什么我首先使用锁定提示存在争议,但我只想知道这种情况下的风险是什么。

sql-server-2000 locking

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

插入/更新死锁

使用 SQL Server 2008 R2:

我目前正在尝试追踪我们遇到的死锁问题的原因。不知道该往哪里转。这是设置。

TABLE Scores:
id INT IDENTITY(1,1),
first_name VARCHAR(50),
last_name VARCHAR(50),
player_id VARCHAR(50),
score INT

PRIMARY KEY/CLUSTERED INDEX: 
id

NON-CLUSTERED INDEX:
first_name, last_name INCLUDES id, player_id, score
Run Code Online (Sandbox Code Playgroud)

多线程应用程序处理消息,然后为每条消息调用两个存储过程之一。

如果应用程序尚未处理用户,它将调用一个存储过程,将一行插入到表中。

如果应用程序已经处理了用户,它会更新first_namelast_namescores、 中的任何一个或全部,first_name并且last_name player_id不会改变。

每个 表中只有一行player_id

应用程序处理消息的线程是根据 player_id 选择的,因此两个线程不会同时处理同一个玩家的消息。

INSERT 和 UPDATE 语句正在使用该WITH (ROWLOCK)指令。

这是问题:

该进程导致死锁,线程 1 锁定主聚集索引,线程 2 锁定非聚集索引。

我不明白为什么会发生锁 - UPDATE 和 INSERT 语句正在使用行锁,并且已经过测试并证明线程没有访问相同的行。

我能做些什么来解决这个问题?

注意事项:

必须存在两个存储过程,一个是更新,一个是插入。尽管我很想切换到单个 MERGE,但这不会发生。:/

sql-server-2008 sql-server deadlock sql-server-2008-r2 locking

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

查找阻塞进程发出的最后一条命令

我已经开发了一个从ERP SAP Business One仓库管理到仓库管理的接口,并且面临着与数据库锁有关的问题。我的程序包括对ERP数据库的直接写入操作(在创建或更改销售订单后的异步事件处理期间填充用户定义的字段)。它被怀疑是造成每天经常发生的阻塞情况的原因。

当发生阻塞情况时,sp_who2给我有关阻塞和阻塞进程的信息,每次都指向一个spidBPM管理软件用作“根阻塞进程”。其状态spid始终显示为“睡眠”。

  1. “休眠”进程是否会导致其他进程的数据库锁定,例如,当事务未提交时?

  2. 如何找出睡眠过程的最后一个命令?

sql-server locking

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

UPDATE WHERE 中的表扫描如何以未索引的列为谓词工作?

我正在调查由两个并发 UPDATE 语句引起的死锁:

UPDATE [table] 
SET [column] = 0 
WHERE [unindexed_column] = @id
Run Code Online (Sandbox Code Playgroud)

我的理解是,因为WHERE预测的列是未索引的,所以执行了全表扫描。对于每一行,获取一个更新锁。如果它与WHERE子句匹配,则它升级到排他锁并保持它直到语句完成。

当会话 A 拥有第 2 行的排他锁并试图获取第 1 行的更新锁,而会话 B 拥有第 1 行的排他锁并试图获取第 2 行的更新锁时,就会发生死锁。

死锁的原因是有道理的,但我不完全理解如何执行表扫描使这种情况成为可能。如果两个查询以相同的顺序执行扫描,最坏的情况似乎是其中一个查询在获取更新锁时被阻塞,直到另一个查询完成并释放它的锁。

表扫描是如何执行的?表格行的扫描顺序是否不一致?如果更新语句未能获得更新锁,它是否会转到下一行并稍后再次尝试上一行?究竟是什么让这种僵局成为可能?

sql-server deadlock sql-server-2008-r2 locking update

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

如何在不锁定的情况下插入数万行?

我有一台服务器,可以接收来自世界各地数千个地点的数据。该服务器定期连接到我的数据库服务器并快速连续插入记录,一次一行。最多可以有 6 个这样的进程 (perl) 同时运行,每个进程可能有超过 50,000 个插入语句,随后,表被锁定。

我想弄清楚是什么导致锁定?我是否最好创建一个多插入,比如,一次 100 行,然后首尾相连?我用什么作为指导方针?

DB 服务器有 100GB RAM 和 12 个处理器。它很少使用,但是当这些插入内容出现时,每个人都会冻结几分钟,这会干扰人们运行报告等。

感谢您的任何建议。我知道我需要错开插入,我只是问什么是推荐的方法来做到这一点。

mysql myisam locking

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

SELECT...FOR UPDATE - 只有 UPDATE 会释放锁吗?

SELECT ...FOR UPDATE在 Java PreparedStatement 中使用 a 。我可能需要也可能不需要执行更新,具体取决于SELECT.

如果我执行rs.close();pStmt.close(); 执行更新,MySQL 会释放锁吗?有没有其他方法可以发布它,还是我必须执行更新?

如果我也使用 Postgres,同样的问题。

不确定它是否重要,但我打算rs.updateRow();用于更新。另外,MySQL 是否支持列级锁定?

基本上,我想在所选行中增加一个计数器,但前提是该行的状态列是ACTIVE。如果它不是ACTIVE,那么我只想在没有更新的情况下释放锁,以便其他线程/进程可以读/写该行。

mysql postgresql locking

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