(1)两种类型的行锁
共享锁(S):允许一个事务去读取一行,阻止其他事务获取相同数据集的排它锁;(查询时不能进其它操作)
排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读取和排他写锁;
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
(2)对于update,delete和insert;innodb会自动加上意向锁排他锁(X),但是对于select语句需要自己手动加:
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
(3)InnoDB行锁实现方式
(4)在InnoDB下,使用表锁要注意
使用LOCK TABLES虽然可以给InnoDB加表级锁,但必须说明的是,
《1》表锁不是由InnoDB存储引擎层管理的,而是由其上一层──MySQL Server负责的,
仅当autocommit=0、innodb_table_locks=1(默认设置)时,InnoDB层才能知道MySQL加的表 锁,
MySQL Server也才能感知InnoDB加的行锁,这种情况下,InnoDB才能自动识别涉及表级锁的死锁;
否则,InnoDB将无法自动检测并处理这种死 锁。有关死锁,下一小节还会继续讨论。
《2》在用 LOCK TABLES对InnoDB表加锁时要注意,要将AUTOCOMMIT设为0,
否则MySQL不会给表加锁;事务结束前,不要用UNLOCK TABLES释放表锁,
因为UNLOCK TABLES会隐含地提交事务;COMMIT或ROLLBACK并不能释放用LOCK TABLES加的表级锁,
必须用UNLOCK TABLES释放表锁。