我正在使用带有InnoDB数据库的mysql。
如果我的所有事务都是插入和选择(没有更新),我认为我不必担心SQL死锁。
我看不到死锁会发生的情况。如果我只进行插入和选择操作,那么我假设死锁不可能发生,这个假设正确吗?
可能与此无关,但每个事务都是用PDO完成的。
不,你仍然需要担心SQL死锁。
即使是插入单行记录的事务,也可能发生死锁。这是因为插入操作并不是真正的原子操作,并且会自动在插入的行的(可能有多个)索引记录上设置锁。
START TRANSACTION; INSERT INTO t1 VALUES(1);
第二节:
START TRANSACTION; INSERT INTO t1 VALUES(1);
第三节:
START TRANSACTION; INSERT INTO t1 VALUES(1);
第一节:
ROLLBACK;
死锁 - Ben EnglishInnoDB MySQL存储引擎具有行级锁,而MyISAM MySQL存储引擎具有表级锁。 MyISAM仅锁定整个表,并且不支持事务,因此不可能出现数据库级死锁。请注意,一个应用程序可以通过在它们都尝试访问的表上保持表锁来锁定另一个应用程序,但这是代码错误,而不是数据库级“死锁”。
InnoDB支持事务并具有行级锁,因此可能会发生数据库级死锁(在繁忙的系统中偶尔会发生,因此您需要编写代码以避免它们)。 MySQL称之为“死锁”的许多情况并不是真正的死锁,而是由于缓慢的UPDATE导致其他查询在行锁上超时的结果。
INSERT
语句:INSERT ... VALUES ...
,INSERT ... SELECT ...
。你会同时使用两种方式,还是只用第一种方式? - ypercubeᵀᴹINSERT ... ON DUPLICATE KEY UPDATE
。我猜你没有这个。 - ypercubeᵀᴹ