如果下面的情况是mysql中的一个bug?
Mysql版本:mysql.x86_64 5.0.77-4.el5_4.1
内核:Linux box2 2.6.18-128.el5#1 SMP Wed Jan 21 10:41:14 EST 2009 x86_64 x86_64 x86_64 GNU/Linux
------------------------
LATEST DETECTED DEADLOCK
------------------------
100125 4:24:41
*** (1) TRANSACTION:
TRANSACTION 0 210510625, ACTIVE 155 sec, process no 28125, OS thread id 1243162944 starting index read
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1216, undo log entries 1
MySQL thread id 162928579, query id 527252744 box22 172.16.11.105 user updating
delete from user_grid_items where user_id = 669786974 …Run Code Online (Sandbox Code Playgroud) 我在这里从理论上讲,我想确保我的所有基础都被覆盖.
我已经阅读了很多关于使用Java的InnoDB以及无论您运行什么查询都会发生死锁的情况.虽然我对理论和最佳实践非常了解,但我对如何在发生死锁时实现重新发布事务的catch all机制几乎一无所知.
是否有特定的例外来听取意见?我只是在我打电话后抛出异常,connection.commit()或者一旦我执行了它就会发生PreparedStatement吗?事情是否应该循环运行,并且限制循环运行的次数?
我基本上只需要一个简单的Java代码示例,说明如何处理这个问题.因为我不确定在哪些因素,例如,我是否重新实例化PreparedStatement对象或先关闭它们等等,这一切都非常令人困惑.同去的ResultSet对象了.
编辑:我应该提到我正在处理事务,将自动提交设置为0等.
编辑2:我是否使用这个伪代码在正确的轨道上?我没有线索
do
{
deadlock = false
try
{
// auto commit = 0
// select query
// update query
// delete query
// commit transaction
}
catch (DeadLockSpecificException e)
{
deadlock = true
}
finally
{
// close resources? statement.close(), resultset.close() etc?
// or do I reuse them somehow and close them after the do/while loop?
// this stuff confuses me a lot too …Run Code Online (Sandbox Code Playgroud) 在postgres日志中:
2016-12-23 15:28:14 +07 [17281-351 trns: 4280939, vtrns: 3/20] postgres@deadlocks HINT: See server log for query details.
2016-12-23 15:28:14 +07 [17281-352 trns: 4280939, vtrns: 3/20] postgres@deadlocks CONTEXT: while locking tuple (0,79) in relation "account"
2016-12-23 15:28:14 +07 [17281-353 trns: 4280939, vtrns: 3/20] postgres@deadlocks STATEMENT: SELECT id FROM account where id=$1 for update;
Run Code Online (Sandbox Code Playgroud)
当我挑起僵局时,我可以看到文字:tuple (0,79).
据我所知,元组只是表中的几行.但我不明白是什么(0,79)意思.我在表帐户中只有2行,它只是游戏和自学应用程序.
那(0,79)意味着什么呢?
我有一个Windows Azure角色,包含两个实例.偶尔,事务将失败并SqlException带有以下文本
事务(进程ID N)在锁资源上与另一个进程死锁,并被选为死锁牺牲品.重新运行该交易.
现在我已经用Google搜索了一段时间,并阅读了有关使用SQL Server日志识别死锁的帖子.
问题是...
我如何在SQL Azure中执行此操作?我可以使用哪些工具来访问SQL Azure的内部并获取足够的数据?
sql-server deadlock azure database-deadlocks azure-sql-database
在主数据库上执行此查询后,它在所有数据库上给我所有正在运行的进程,是否有任何查询将终止在数据库上运行的所有进程.
USE
Master
GO
SELECT
SPID,DBID FROM SYSPROCESSES
WHERE
DBID NOT IN (1,2,3,4) AND SPID >50 AND SPID<> @@spid
Run Code Online (Sandbox Code Playgroud) 我正在使用Magento 1.7.0.2社区版,我遇到了一个大问题 - 死锁和"锁定等待超时超时"错误.执行特定CRON任务时 存在问题
所以我的问题 - 有没有办法如何避免这种情况(无论是在PHP,MySQL还是服务器(我们使用nginx)级别)?
我是PostgreSQL的新手.我想为这个时间表模拟死锁:

如何在PostgreSQL中模拟死锁?有可能吗?如何锁定特定列?
编辑:
BEGIN;
UPDATE deadlock_demonstration
SET salary1=(SELECT salary1
FROM deadlock_demonstration
WHERE worker_id = 1
FOR UPDATE)+100
WHERE worker_id=1;
SELECT pg_sleep(5);
commit;
SELECT salary2 FROM deadlock_demonstration WHERE worker_id = 1 FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
在另一个屏幕中,我已经运行了这个
BEGIN;
UPDATE deadlock_demonstration
SET salary2=(SELECT salary1
FROM deadlock_demonstration
WHERE worker_id = 1
FOR UPDATE)+200
WHERE worker_id=1;
SELECT pg_sleep(5);
commit;
SELECT salary1 FROM deadlock_demonstration WHERE worker_id = 1 FOR UPDATE;
Run Code Online (Sandbox Code Playgroud)
为什么没有发生死锁?你能给出一个建议,我应该改变什么来刺激僵局?
为什么删除 PostgreSQL 中的表需要ACCESS EXCLUSIVE锁定任何引用的表?如何将其减少到ACCESS SHARED锁定或根本不锁定?即有没有办法在不锁定引用表的情况下删除关系?
我在文档中找不到任何关于需要哪些锁的提及,但是除非我在并发操作期间删除多个表时以正确的顺序明确获取锁,否则我可以看到死锁在日志中等待 AccessExclusiveLock,并获取此限制当表被删除时,对常用表的锁定会导致其他进程的暂时延迟。
澄清,
CREATE TABLE base (
id SERIAL,
PRIMARY KEY (id)
);
CREATE TABLE main (
id SERIAL,
base_id INT,
PRIMARY KEY (id),
CONSTRAINT fk_main_base (base_id)
REFERENCES base (id)
ON DELETE CASCADE ON UPDATE CASCADE
);
DROP TABLE main; -- why does this need to lock base?
Run Code Online (Sandbox Code Playgroud) 警告!!!TL; DR
MySQL 5.6.39
mysql:mysql-connector-java:5.1.27
org.hibernate.common:hibernate-commons-annotations:4.0.5.Final
org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
org.hibernate:hibernate-core:4.3.6.Final
org.hibernate:hibernate-entitymanager:4.3.6.Final
org.hibernate:hibernate-validator:5.0.3.Final
Run Code Online (Sandbox Code Playgroud)
HTTP方法:POST,API路径:/ reader
实体“ 读者 ”引擎:innoDB
id
name
total_pages_read
Run Code Online (Sandbox Code Playgroud)
类映射:
@Entity
@Table(name = "reader")
public class Reader{
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "total_pages_read")
private Long total_pages_read;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "reader", orphanRemoval = true)
private Set<Book_read> book_reads;
...
}
Run Code Online (Sandbox Code Playgroud)
我在Reader写入服务类中使用方法createEntity()和recalculateTotalPageRead():
@Service
public class ReaderWritePlatformServiceJpaRepositoryImpl{
private final ReaderRepositoryWrapper readerRepositoryWrapper;
...
@Transactional
public Long createEntity(final Long id, final String name, final …Run Code Online (Sandbox Code Playgroud) 我有执行连接的一个存储过程TableB以TableA:
SELECT <--- Nested <--- TableA
Loop <--
|
---TableB
Run Code Online (Sandbox Code Playgroud)
同时,在事务中,行插入TableA,然后插入TableB.
这种情况偶尔会导致死锁,因为存储过程选择从TableB中获取行,而insert将行添加到TableA,然后每个都希望另一个放弃另一个表:
INSERT SELECT
========= ========
Lock A Lock B
Insert A Select B
Want B Want A
....deadlock...
Run Code Online (Sandbox Code Playgroud)
逻辑要求INSERT首先向A添加行,然后向B添加行,而我个人并不关心SQL Server执行其连接的顺序 - 只要它加入.
修复死锁的一般建议是确保每个人以相同的顺序访问资源.但在这种情况下,SQL Server的优化器告诉我相反的顺序是"更好".我可以强制执行另一个连接顺序,并且查询效果更差.
但是我应该吗?
我应该使用我希望它使用的连接顺序现在和永远覆盖优化器吗?
或者我应该只是捕获错误本机错误1205,并重新提交select语句?
问题不是当我覆盖优化器并且它做非理想的事情时,查询可能会执行多么糟糕.问题是:自动重试是否更好,而不是运行更糟糕的查询?
sql-server error-handling deadlock sql-server-2000 database-deadlocks
deadlock ×6
mysql ×3
postgresql ×3
java ×2
sql-server ×2
azure ×1
concurrency ×1
drop-table ×1
hibernate ×1
innodb ×1
jpa ×1
magento ×1