标签: database-deadlocks

甲骨文死锁的历史?

oracle是否保留了有关死锁的历史记录?

例如,我可以知道在检测到死锁时执行了哪些sqls,并且抛出了oracle异常ORA-00060(在等待资源时检测到死锁)?

提前致谢.

oracle database-deadlocks

5
推荐指数
1
解决办法
4527
查看次数

MySQL死锁检测

MySQL是否总是自动检测死锁?还是在某些情况下,MySQL无法弄清它正在处理死锁?

mysql database-deadlocks

5
推荐指数
1
解决办法
5950
查看次数

如何解决索引/密钥相关的死锁问题

我使用SQL Server 2008中死锁图在我的SQL Server中诊断出死锁问题.

问题与我的索引有关.我有两个查询:一个长时间运行的报告,其中有很多连接和子查询,它们根据基表上的两个不同日期提取数据,还有一个快速更新查询,它会更新该基表上的相同日期.我有两个索引,并且报告想要对它们两者进行共享KEY锁定,而更新查询需要对它们两者进行独占KEY锁定,并且不知何故每个查询只设法获取其中一个键,因此两者都不能继续.

我该怎么做才能解决这个问题?

以下是我的具体情况:

我的基表如下所示:

CREATE TABLE job_tb{
    job_id int IDENTITY(1,1),
    createDate datetime NULL,
    upDate datetime NULL,
    dataField1 nchar(1),
    dataField2 nchar(2),
    --etc...
}
Run Code Online (Sandbox Code Playgroud)

我的索引看起来像这样:

CREATE NONCLUSTERED INDEX idx_createDate ON job_tb(
  createDate DESC
)
INCLUDE(dataField1, dataField2)

CREATE NONCLUSTERED INDEX idx_upDate ON job_tb(
  upDate DESC
)
INCLUDE(dataField1, dataField2)
Run Code Online (Sandbox Code Playgroud)

最后,我的更新如下所示:

BEGIN TRANSACTION;
    UPDATE job_tb
    SET
        dataField1 = @data
        upDate = @upDate
    WHERE
        job_id = @job_id
COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)

报告按日期计算各种统计数据,因此我不会在此处列出.我故意将idx_createDate和idx_upDate设计为"覆盖"或包含dataField1,因为它在该报告中大量使用.

我相信报告会抓取其中一个索引的共享锁,然后命中子查询并请求锁定第二个索引.同时,更新查询需要对两个索引进行独占锁定,以便更新upDate和包含的dataField1.

你们有什么感想?

编辑: 这是XML死锁图,按要求:

<deadlock-list>  <deadlock>
<victim-list>
    <victimProcess …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server concurrency sql-server-2008 database-deadlocks

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

如何解决SQL Server死锁 - 一旦更改顺序和缩短查询已用尽?

我有两个假设的问题:

UPDATE BankAccounts SET HomePhone = '+1 252-555-0912' 
WHERE AccountNumber = 14400000619
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM BankAccounts 
WHERE HomePhone = '555-1212'
Run Code Online (Sandbox Code Playgroud)

在没有额外索引的假设表上:

CREATE TABLE BankAccounts 
( 
   AccountNumber bigint NOT NULL PRIMARY KEY CLUSTERED,
   FirstName nvarchar(50) NOT NULL,
   MiddleName nvarchar(50) NULL,
   LastName nvarchar(50) NOT NULL,
   HomePhone varchar(50) NULL,
   IsClosed tinyint DEFAULT 0
)
Run Code Online (Sandbox Code Playgroud)

一切都会很棒.如果我添加一个索引HomePhone:

CREATE INDEX IX_BankAccounts_HomePhone ON BankAccounts 
( HomePhone)
Run Code Online (Sandbox Code Playgroud)

现在我的SELECT陈述可能是一个僵局的受害者:

Tranasction(进程ID 169)在锁资源上与另一个进程陷入僵局,并被选为死锁牺牲品.重新运行该交易.

共同的建议是:

  • 以相同的顺序访问表
  • 保持交易尽可能短

除了这种情况:

  • 我以相同的顺序访问(一)表(1选1是1)
  • 交易是单一的声明 ; 我不能比这更短

消除这种死锁的长期解决方案是什么?

我正在考虑将我的 …

sql-server sql-server-2008-r2 database-deadlocks

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

返回HTTP 503以响应数据库死锁是否合适?

503 ("Service Unavailable")当请求的操作导致数据库死锁时,服务器返回是否合适?

这是我的理由:

  • 最初,我尝试避免数据库死锁,但遇到了/sf/answers/7857951/
  • 接下来,我尝试在服务器端重复请求,但是遇到了Java Servlet:如何重复HTTP请求?。从技术上讲,我可以缓冲请求实体,但是可伸缩性会受到影响,并且503 Service Unavailable无论如何客户端都更有可能看到。

视为:

  • 要求客户重复操作更为容易。
  • 他们503 Service Unavailable无论如何都要能够处理。
  • 数据库死锁非常少见。

我倾向于这种解决方案。你怎么看?

更新:我认为503 ("Service Unavailable")如果您希望返回仍然可以接受,但是我不再认为这是技术要求。参见/sf/answers/1257203321/

rest database-deadlocks http-status-code-503

5
推荐指数
1
解决办法
855
查看次数

涉及外键约束的死锁

我想更好地理解postgres中的锁定机制.

假设树可以有苹果(通过苹果桌上的外键).似乎在选择树时进行更新锁定是在苹果上获得的.但是,即使其他人已经锁定了这个苹果,操作也不会被阻止.

为什么会这样?

ps请不要建议删除"选择更新".

脚本

Transaction 1      Transaction 2
BEGIN              .
update apple;      .
.                  BEGIN
.                  select tree for update;
.                  update apple;
.                  --halts because of the other transaction locking an apple
update apple;      .
-- deadlock        .
                   COMMIT
                   --transaction succeeds
Run Code Online (Sandbox Code Playgroud)

如果你想在你的postgres中尝试 - 这是一个你可以复制/粘贴的代码.

我有一个以下的数据库架构

CREATE TABLE trees (
    id       integer primary key
);

create table apples (
    id       integer primary key,
    tree_id  integer references trees(id)
);
Run Code Online (Sandbox Code Playgroud)

而且非常简单的数据

insert into trees values(1);
insert into apples values(1,1);
Run Code Online (Sandbox Code Playgroud)

有两个简单的交易.一个是更新苹果,第二个是锁定树并更新苹果. …

postgresql deadlock database-deadlocks

5
推荐指数
1
解决办法
6030
查看次数

两个更新语句之间的SQL Server死锁

我有一个网站,上面有一个非常受欢迎的论坛,有时候我整天都看到同一论坛上两个相同的(减去其中的数据)更新语句之间发生了几个死锁。我不确定为什么在此查询中会发生这种情况,因为网站上还有许多其他查询都以高并发率运行而没有问题。

更新死锁图

全图

这两个进程之间的查询几乎相同,该图将其显示为:

update [Forum] set [DateModified] = @DateModified, [LatestLocalThreadID] = @LatestLocalThreadID where ID = 310     
Run Code Online (Sandbox Code Playgroud)

任何人都可以弄清这是什么原因吗?

sql-server database-deadlocks

5
推荐指数
1
解决办法
2522
查看次数

如果以相同的顺序访问对象,如何发生死锁?

关于"最小化死锁"的MS Technet页面上,它说"无法完全避免死锁".更具体地说,它表明了这一点

如果所有并发事务以相同顺序访问对象,则不太可能发生死锁.

这意味着即使所有事务以相同的顺序访问对象,理论上也可能发生死锁.有人可以举例说明如何做到这一点吗?

sql sql-server transactions database-deadlocks

5
推荐指数
1
解决办法
468
查看次数

Mysql - 序列化失败:1213尝试获取锁定时发现死锁; 尝试重新启动事务

我有menus,categoriesproducts表.我使用的是mysql 5.5,所有表都是innoDB,在所有情况下,id都是自动增量的主键(int).

menus table
id, name, status

categories table
id, menu_id, name

products table
id, menu_id, category_id, status, name, url, content
Run Code Online (Sandbox Code Playgroud)

多个脚本可以并行运行,执行包含以下逻辑的相同php文件.

START TRANSACTION;
SET autocommit = 0;

LOCK TABLES products WRITE, categories WRITE, menus WRITE;

SELECT 
  p.`id`,
  p.`name`,
  p.`url`,
  p.`status`,
  c.`id` cat_id,
  c.`name` cat_name,
  m.`id` `menu_id`,
  m.`name` menu_name
FROM
  products p 
  LEFT JOIN categories c 
    ON p.`subcategory_id` = c.`id` 
  LEFT JOIN menus m 
    ON p.`menu_id` = m.`id` 
   WHERE p.`status` = 0 LIMIT 1 …
Run Code Online (Sandbox Code Playgroud)

mysql locking database-deadlocks table-locking

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

如何解决由于休眠envers审计而导致的MySQL死锁?

在并行运行少量事务时,大多数情况下,我会陷入僵局:

------------------------
LATEST DETECTED DEADLOCK
------------------------
2019-09-04 06:19:12 0x2b01917c7700
*** (1) TRANSACTION:
TRANSACTION 14470484, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 13 lock struct(s), heap size 1136, 7 row lock(s), undo log entries 4
MySQL thread id 69372, OS thread handle 47285779531520, query id 10366178979 172.31.19.11 master updating
update `VerificationActionLog_AUD` set `REVEND`=427956 where `id`=138136 and `REV`<> 427956 and `REVEND` is null
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS …
Run Code Online (Sandbox Code Playgroud)

mysql hibernate database-deadlocks hibernate-envers

5
推荐指数
1
解决办法
108
查看次数