当数据库有事务的时候,可能会产生数据的不一致,这时就需要一些机制来保证访问的次序,这就是锁的机制;
锁的作用:用于挂你对共享资源的并发访问,保证数据库的完整性和一致性。
##1. 不同引擎的锁以及锁分类
Mysql数据库中,InnoDB支持表、行级锁,而MyISAM支持表级锁
Mysql大致可以归纳为以下3种锁:
- 表级锁:开销小,加锁块,不会出现死锁,发生锁冲突的概率最高,并发度最低。
- 行级锁:开销大,加锁慢,会出现死锁,发生锁冲突的概率最低,并发度最高。
- 页面锁:开销和加锁的时间介于表级锁和行级锁之间,会出现死锁,锁粒度介于两者之间;并发度一般,一次锁定相邻一组记录
Mysql表级锁两种模式: 表共享锁(Table Read Lock)和 表独占写锁(Table Write Lock),表现如下:
- 对一个表的读操作,不会阻塞其他用户对同一表请求,但会阻塞对同一表的写请求;
- 对MyISAM的写操作,则会则色其他用户对同一表的读和写操作;
- MyISAM表的读操作和写操作之间,以及写操作之间是串行的。
当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作,其他线程的读、写操作都会等待。
2.加表级锁
MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。
给MyISAM表显式加锁,一般是为了一定程度模拟事务操作,实现对某一时间点多个表的一致性读取。例如,有一个订单表orders,其中记录有订单的总金额total,同时还有一个订单明细表order_detail,其中记录有订单每一产品的金额小计subtotal,假设我们需要检查这两个表的金额合计是否相等,可能就需要执行如下两条SQL