innodb各隔离级别下对select是否自动加锁?
InnoDB 在 READ-UNCOMMITTED、READ-COMMITTED 和 REPEATABLE-READ 级别中,未明确加锁的 SELECT 语句都使用“持续非锁定读”的查询方式,这种方式下,查询语句不对读取的表加任何锁。在事务内看到的是事务开始时刻前,所有已经提交的事务的结果的快照 (利用多版本的方式)。
而在 SERIALIZABLE 级别,未明确加锁的 SELECT 语句被隐式转换为 SELECT … LOCK IN SHARE MODE
from:http://phpoo.com/?action-viewnews-itemid-92
概述
本文会简单介绍 Mysql 使用的支持事务的存储引擎 InnoDB 的隔离级别,以及每个隔离级别下回产生的并发问题。同时为了更加深刻的理解 InnoDB 引擎的隔离级别,还会探讨如何通过加锁解决不同隔离级别下的并发问题。本文使用的实验环境是 mysql-5.1.33-win32,其他版本的 MySQL 可能会有不同。
隔离级别标准
SQL 标准中定义了四个隔离级别,他们分别是:
READ-UNCOMMITTED | 读未提交 |
READ-COMMITTED | 读提交 |
REPEATABLE-READ | 可重复读 |
SERIALIZABLE | 串行化 |
在 InnoDB 中根据 SQL:1992 事务隔离级别,使用 REPEATABLE-READ 作为默认隔离级别。
并发产生的问题
为了说明下面的并发问题, 首先建立一个表 foobar:
DROP TABLE IF EXISTS `foobar`;