MYSQL - 锁定 - InnoDB

4

我正在使用带有InnoDB数据库的mysql。

如果我的所有事务都是插入和选择(没有更新),我认为我不必担心SQL死锁。

我看不到死锁会发生的情况。如果我只进行插入和选择操作,那么我假设死锁不可能发生,这个假设正确吗?

可能与此无关,但每个事务都是用PDO完成的。


1
有不同的 INSERT 语句:INSERT ... VALUES ..., INSERT ... SELECT ...。你会同时使用两种方式,还是只用第一种方式? - ypercubeᵀᴹ
还有INSERT ... ON DUPLICATE KEY UPDATE。我猜你没有这个。 - ypercubeᵀᴹ
这个问题是关于特定的事务隔离级别吗?还是一般性的问题(涉及所有隔离级别)? - ypercubeᵀᴹ
2个回答

1

不,你仍然需要担心SQL死锁。

即使是插入单行记录的事务,也可能发生死锁。这是因为插入操作并不是真正的原子操作,并且会自动在插入的行的(可能有多个)索引记录上设置锁。


如果您只运行“INSERT INTO ... VALUES”语句,是否可能发生死锁?您能举个例子吗? - ypercubeᵀᴹ
这与死锁是否会在此情况下发生无关。插入操作“可能”会锁定索引的一部分,无论您是使用INSERT VALUES还是INSERT SELECT等方式。 - Ben English
任何事务都可能锁定行、表或索引。但不同类型的事务会产生不同类型的锁。这与死锁是如何发生有关。 - ypercubeᵀᴹ
一个明显的例子是重复键错误,该错误会在重复索引记录上造成共享锁定。如果多个会话都试图插入相同的行,则可能导致死锁。 - Ben English
第一节:START TRANSACTION; INSERT INTO t1 VALUES(1); 第二节: START TRANSACTION; INSERT INTO t1 VALUES(1); 第三节: START TRANSACTION; INSERT INTO t1 VALUES(1); 第一节: ROLLBACK;死锁 - Ben English

0

InnoDB MySQL存储引擎具有行级锁,而MyISAM MySQL存储引擎具有表级锁。 MyISAM仅锁定整个表,并且不支持事务,因此不可能出现数据库级死锁。请注意,一个应用程序可以通过在它们都尝试访问的表上保持表锁来锁定另一个应用程序,但这是代码错误,而不是数据库级“死锁”。

InnoDB支持事务并具有行级锁,因此可能会发生数据库级死锁(在繁忙的系统中偶尔会发生,因此您需要编写代码以避免它们)。 MySQL称之为“死锁”的许多情况并不是真正的死锁,而是由于缓慢的UPDATE导致其他查询在行锁上超时的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接