2012-01-30 62 views
4

我在InnoDB数据库中使用mysql。MYSQL - 锁定 - InnoDB

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

我看不到会发生死锁的场景。我是否正确地认为,如果我只进行插入和选择,就不会发生死锁?

可能不相关,但一切事务与PDO

+1

有不同的'INSERT'语句:'INSERT ... VALUES ...','INSERT ... SELECT ...'。你使用两个还是仅使用第一个变体? – 2012-02-01 20:04:31

+0

还有'INSERT ... ON DUPLICATE KEY UPDATE'。我想你没有那个。 – 2012-02-01 20:31:32

+0

这是关于特定事务隔离级别的问题吗?还是一般的(关于所有这些)? – 2012-02-01 20:33:11

回答

1

号你还是担心SQL死锁完成。

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

+0

如果您只运行'INSERT INTO ... VALUES'语句,会发生死锁吗?你能给个例子吗? – 2012-02-01 20:16:42

+0

这与在这种情况下是否会发生死锁确实无关。无论您使用的是INSERT VALUES还是INSERT SELECT等,插入“可能”会锁定索引的一部分。 – 2012-02-01 20:43:31

+0

任何事务都可能锁定行或表或索引。但不同类型的事务可以做不同类型的锁。这与死锁发生的方式有关。 – 2012-02-01 20:47:23

0

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

InnoDB支持事务并且具有行级锁,因此db级的死锁是可能的(并且偶尔会在繁忙的系统中发生,所以您确实需要围绕它们进行编码)。很多MySQL会称之为“死锁”并不是“真正的死锁”,因为它们是由于UPDATE缓慢导致其他查询在行锁定上超时导致的。