晚了,我一直面临着很多行锁争用。争用的表似乎是一个特定的表。
一般是这样的——
大约 5 分钟后,前端似乎没有响应。检查会话显示行锁争用。每个人都抛出的“解决方案”是终止会话:/
作为数据库开发人员
如果这个问题感觉过于开放/信息不足,请随时编辑/让我知道 - 我会尽力添加一些额外的信息。
有问题的表有很多插入和更新,我想说它是最繁忙的表之一。SP 相当复杂 - 为简化起见 - 它从各种表中获取数据,将其填充到工作表中,在工作表上发生大量算术运算,并将工作表的结果插入/更新到相关表中。
数据库版本为 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit。逻辑流在两个会话中以相同的顺序执行,事务不会保持打开太长时间(或者至少我认为是这样),并且在事务的主动执行期间发生锁定。
更新:表格行数比我预期的要大,大约有 310 万行。此外,在跟踪会话后,我发现该表的几个更新语句没有使用索引。为什么会这样 - 我不确定。where 子句中引用的列已编入索引。我目前正在重建索引。
我最近看到一些非常基本的更新超时,但无法确定原因。一个例子:
//# Query_time: 51 Lock_time: 0 Rows_sent: 0 Rows_examined: 0
UPDATE photos SET position = position + 1 WHERE (photo_album_id = 40470);
同一个日志没有 Lock_time > 0 的条目。运行show innodb status也不会显示任何相关的锁。根据我的应用服务器日志(显示Mysql::Error: Lock wait timeout exceeded与 mysql-slow 日志中的每个相应条目相关的错误),此问题似乎影响了至少 5 个不同的表。
知道从这里去哪里吗?我在各个方向都陷入了死胡同。谢谢。
编辑:
创建表`照片`( `id` int(11) NOT NULL auto_increment, `type` varchar(255) 非空, `photo_album_id` int(11) 非空, `user_id` int(11) 非空, `title` varchar(255) 默认为“无标题”, `描述`文本, `credit` varchar(255) 默认为 NULL, `photo_file_name` varchar(255) 默认为 NULL, `photo_content_type` varchar(255) 默认为 NULL, `photo_file_size` int(11) 默认为 NULL, `photo_updated_at` 日期时间默认为 …
我在死锁分析中遇到了死点。根据msdn:
RangeX-X 为 Exclusive range,独占资源锁;在更新范围内的键时使用。RangeI-N 是插入范围,空资源锁;用于在将新键插入索引之前测试范围。
所以我明白,如果我在 2 个键列上有一个索引 - 并且我插入一个新键,我将拥有 RangeI-N 锁,但如果我从索引更新现有键,我将拥有 RangeX-X。
但我的问题或多或少复杂。假设我在 A、B 列和 C 列上有索引 IX_keys_included。
在 Serializable 隔离模式下,我为包含的列 C 插入一个新值。索引 IX_keys_included 是否会有 RangeI-N 或 RangeX-X 锁?实际上,鉴于我为索引中包含的列插入了一个新列,是否会有任何锁定?
我发现
但是没有答案并且与我的问题不完全相同(尽管非常相似)。
假设我执行以下操作:
myfunc()myfunc()myfunc()从事务 A调用第 6 步会发生什么? 我是否调用了步骤 1 中定义的原始函数?还是第 4 步中的修改形式(在第 5 步中提交)?
如果函数在第 4 步中被删除而不是被修改,那么第 6 步会失败还是成功?(这可能是同一个问题,但修改的工作方式可能不同。)
关于这个的文档在哪里?
我的一个查询遇到了行锁争用。我已经找到了导致这种情况的表 - 那么下一步是什么?哪个会话导致此表被锁定?如何解除锁定?
我正在使用 Oracle 10g
我最近继承了一个 MSSQL 数据库,因为我们的 DBA 已经转向更美好的领域。我不是 DBA,只有中等的 SQL 知识,但不得不承担他的一些职责,并且遇到了一个问题,我在导航时遇到了一些麻烦。
我们遇到了一个问题,即通过 Excel 访问数据库的用户往往会导致数据库操作停止,这会影响我们的 ERP 软件。我们当前的解决方法是查看 SSMS 中的活动监视器并终止有问题的 Microsoft Office 应用程序。
我希望有一个每隔几分钟运行一次的脚本化任务,以保持事情顺利进行,并且当系统出现故障时,用户不会涌向 IT。
我发现以下查询将允许我提取锁定类型和其他有用的数据(例如等待时间),但不能提取活动监视器中找到的特定应用程序。
select * from sys.dm_exec_requests where wait_type = 'LCK_M_S'
理想情况下,此代码将找到 wait_type 为 LCK_M_S 的应用程序 Microsoft Office,并终止等待时间最长的任务,并在一天中根据需要重复。
预先感谢您的回复。
locking ×2
oracle-10g ×2
excel ×1
functions ×1
innodb ×1
mysql ×1
postgresql ×1
query ×1
sql-server ×1
transaction ×1
wait-types ×1