首页 > 数据库 > 其他综合 >

MySQLInnoDB锁机制

2017-04-05

MySQLInnoDB锁机制,为了解决数据库并发控制问题,如,在同一时间,客户端对于同一个表做表更新或者查询操作,为了保证数据的一致性,需要对并发操作进行控制,因此产生了锁。同时为了实现MySQL的各个隔离级别,锁机制为其提供了保证。

为了解决数据库并发控制问题,如,在同一时间,客户端对于同一个表做表更新或者查询操作,为了保证数据的一致性,需要对并发操作进行控制,因此产生了锁。同时为了实现MySQL的各个隔离级别,锁机制为其提供了保证。

锁的类型

共享锁

共享锁的代号是S,share的缩写,共享锁的粒度是行或者元组(多行)。一个事务获取了共享锁之后,可以对锁定范围内的数据执行读操作。(select)

排他锁

排他锁的代号是X,是eXclusive的缩写,排它锁的粒度和共享锁相同,也是行或者元组。一个事务获取了排它锁之后,可以对锁定范围内的数据执行写操作(insert, update, delete)

意向锁

意向锁是一种表锁,锁定的粒度是整张表,分为意向共享锁(IS),意向排它锁(IX)两类。意向锁表示一个事务有意数据上共享锁或者排他锁。有意表示事务想执行,但还没有真正执行。

锁的粒度主要分为表锁、行锁。行锁耗费较大资源,降低系统性能。表锁支持并发量很低。

以下是MySQL中一些语句执行时锁的情况:

select...lock in share mode

这个操作会加上一个共享锁。若会话事务中查询的数据已经被其它会话事务加上排他锁,那么共享锁会等待其结束再加,若等待时间超过,就会显示事务需要的锁超时。

select...for udpate

此操作加上一个排它锁,其它会话事务将无法再加其他锁,必须等待其结束。

insert/update/delete

会话事务对DML语句操作的数据加上一个排它锁,其它会话的事务会等待其释放排它锁。

如果两个事务A和B,如果事务A获取了一个元组的共享锁,事务B还可以立即获取这个元组的共享锁,但不能立即获取这个元组的排他锁,必须等到事务A释放共享锁之后。

如果事务A获取了一个元组的排他锁,事务B不能立即获取这个元组的共享锁,也不能立即获取这个元组的排它锁,必须等到A释放排它锁之后。

InnoDB引擎会自动给会话事务中的共享锁、更新锁、和排它锁加上一个间隙锁或者称为范围锁,对不存在的数据也锁住,防止出现幻写。

相关文章
最新文章
热点推荐