oracle是否保留了有关死锁的历史记录?
例如,我可以知道在检测到死锁时执行了哪些sqls,并且抛出了oracle异常ORA-00060(在等待资源时检测到死锁)?
提前致谢.
我使用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
我有两个假设的问题:
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)在锁资源上与另一个进程陷入僵局,并被选为死锁牺牲品.重新运行该交易.
共同的建议是:
除了这种情况:
消除这种死锁的长期解决方案是什么?
我正在考虑将我的 …
503 ("Service Unavailable")当请求的操作导致数据库死锁时,服务器返回是否合适?
这是我的理由:
503 Service Unavailable无论如何客户端都更有可能看到。视为:
503 Service Unavailable无论如何都要能够处理。我倾向于这种解决方案。你怎么看?
更新:我认为503 ("Service Unavailable")如果您希望返回仍然可以接受,但是我不再认为这是技术要求。参见/sf/answers/1257203321/。
我想更好地理解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)
有两个简单的交易.一个是更新苹果,第二个是锁定树并更新苹果. …
我有一个网站,上面有一个非常受欢迎的论坛,有时候我整天都看到同一论坛上两个相同的(减去其中的数据)更新语句之间发生了几个死锁。我不确定为什么在此查询中会发生这种情况,因为网站上还有许多其他查询都以高并发率运行而没有问题。

这两个进程之间的查询几乎相同,该图将其显示为:
update [Forum] set [DateModified] = @DateModified, [LatestLocalThreadID] = @LatestLocalThreadID where ID = 310
Run Code Online (Sandbox Code Playgroud)
任何人都可以弄清这是什么原因吗?
在关于"最小化死锁"的MS Technet页面上,它说"无法完全避免死锁".更具体地说,它表明了这一点
如果所有并发事务以相同顺序访问对象,则不太可能发生死锁.
这意味着即使所有事务以相同的顺序访问对象,理论上也可能发生死锁.有人可以举例说明如何做到这一点吗?
我有menus,categories和products表.我使用的是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) 在并行运行少量事务时,大多数情况下,我会陷入僵局:
------------------------
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) sql-server ×4
mysql ×3
concurrency ×1
deadlock ×1
hibernate ×1
locking ×1
oracle ×1
postgresql ×1
rest ×1
sql ×1
t-sql ×1
transactions ×1