标签: locked-objects

跟踪、调试和修复行锁争用

晚了,我一直面临着很多行锁争用。争用的表似乎是一个特定的表。

一般是这样的——

  • 开发人员 1 从 Oracle Forms 前端屏幕启动事务
  • 开发人员 2 从使用同一屏幕的不同会话开始另一个事务

大约 5 分钟后,前端似乎没有响应。检查会话显示行锁争用。每个人都抛出的“解决方案”是终止会话:/

作为数据库开发人员

  • 可以做些什么来消除行锁争用?
  • 是否有可能找出存储过程的哪一行导致这些行锁争用
  • 减少/避免/消除编码问题的一般准则是什么?

如果这个问题感觉过于开放/信息不足,请随时编辑/让我知道 - 我会尽力添加一些额外的信息。


有问题的表有很多插入和更新,我想说它是最繁忙的表之一。SP 相当复杂 - 为简化起见 - 它从各种表中获取数据,将其填充到工作表中,在工作表上发生大量算术运算,并将工作表的结果插入/更新到相关表中。


数据库版本为 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit。逻辑流在两个会话中以相同的顺序执行,事务不会保持打开太长时间(或者至少我认为是这样),并且在事务的主动执行期间发生锁定。


更新:表格行数比我预期的要大,大约有 310 万行。此外,在跟踪会话后,我发现该表的几个更新语句没有使用索引。为什么会这样 - 我不确定。where 子句中引用的列已编入索引。我目前正在重建索引。

oracle-10g locked-objects locking

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

无法解释的 InnoDB 超时

我最近看到一些非常基本的更新超时,但无法确定原因。一个例子:

//# 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` 日期时间默认为 …

mysql innodb query locked-objects

11
推荐指数
1
解决办法
2288
查看次数

SQL Server - RangeX-X 和 RangeI-N 锁

我在死锁分析中遇到了死点。根据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 锁?实际上,鉴于我为索引中包含的列插入了一个新列,是否会有任何锁定?

sql-server locked-objects locking

8
推荐指数
1
解决办法
2876
查看次数

在已打开的事务中是否仍然可以使用已删除(或更改)的功能?

我发现

但是没有答案并且与我的问题不完全相同(尽管非常相似)。


假设我执行以下操作:

  1. 创建函数 myfunc()
  2. 从客户端 A 开始事务
  3. 从客户端 B 开始事务
  4. 在事务B中,使用“创建或替换功能”修改定义 myfunc()
  5. 提交事务 B
  6. myfunc()从事务 A调用

第 6 步会发生什么? 我是否调用了步骤 1 中定义的原始函数?还是第 4 步中的修改形式(在第 5 步中提交)?


如果函数在第 4 步中被删除而不是被修改,那么第 6 步会失败还是成功?(这可能是同一个问题,但修改的工作方式可能不同。)


关于这个的文档在哪里?

postgresql locked-objects transaction functions

7
推荐指数
2
解决办法
206
查看次数

如何移除对象上的锁?

我的一个查询遇到了行锁争用。我已经找到了导致这种情况的表 - 那么下一步是什么?哪个会话导致此表被锁定?如何解除锁定?

我正在使用 Oracle 10g

oracle-10g locked-objects

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

如何编写脚本来杀死 MSSQL 中的 MS Office 数据库锁

我最近继承了一个 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,并终止等待时间最长的任务,并在一天中根据需要重复。

预先感谢您的回复。

locked-objects excel wait-types sql-server-2014

6
推荐指数
1
解决办法
639
查看次数