一、介绍
锁机制:
当客户端操作表(记录)时,为了保证操作的隔离性(多个客户端操作不能相互影响),通过加锁来处理。
操作方面:
读锁:读操作时增加的锁,也叫共享锁,S-lock。特征是所有人都只可以读,只有释放锁之后才可以写。
写锁:写操作时增加的锁,也叫独占锁或排他锁,X-lock。特征,只有锁表的客户可以操作(读写)这个表,其他客户读都不能读。
锁定粒度(范围)
表级锁:开销小,加锁快,发生锁冲突的概率最高,并发度最低。
myisam引擎的表支持表锁,
行级锁:开销大,加锁慢,发生锁冲突的概率最低,并发度也最高。
innodb引擎的表支持行锁与表锁
二、演示操作
1、表锁
建立测试表,并添加测试数据:
create table user(
id int primary key auto_increment,
name varchar(32) not null default '',
age tinyint unsigned not null default 0,
email varchar(32) not null default '',
classid int not null default 1
)engine myisam charset utf8;
insert into user values(null,'xiaogang',12,'gang@sohu.com',4),
(null,'xiaohong',13,'hong@sohu.com',2),
(null,'xiaolong',31,'long@sohu.com',2),
(null,'xiaofeng',22,'feng@sohu.com',3),
(null,'xiaogui',42,'gui@sohu.com',3);
添加锁的语法: lock table table_name1 read|write,table_name2 read|write
释放锁的语法:unlock tables
注意:
- 添加读锁后,自己和其他的进程(用户)只能对该表查询操作,自己也不能执行修改操作。自己查询会直接报错,其他用户查询会产生阻塞情况。
-
添加表的锁定后,针对锁表的用户,只能操作锁定的表,不能操作没有锁定的表。
- 添加写锁,只有锁表的客户可以操作(读写)这个表,其他客户读都不能读。
2、行锁
innodb存储引擎是通过给索引上的索引项加锁来实现的,这就意味着:只有通过索引条件(主键)检索数据,innodb才会使用行级锁,否则,innodb使用表锁
语法:
语法:
begin;(开始)
执行语句;
commit; (释放)
3、php实现锁机制
从数据库中取出id的值(比如id=100)
把这个值+1(id=100+1)
再把该值存回到数据库(id=101)
首先创建一张表
create table a(id int) engine myisam charset utf8;
添加数据
insert into a values(100);
代码如下:
$pdo = new PDO('mysql:host=localhost;dbname=slf_test','root','');
//设置字符集
$pdo->exec('set names utf8');
//添加锁
$pdo->exec('lock table a write');
//取出id
$res = $pdo->query('select id from a');
$info = $res->fetch(PDO::FETCH_ASSOC);
$id = $info['id'];
//给id的值加一
$id = $id+1;
//把值写入数据库
$pdo->exec('update a set id=$id');
//释放锁
$pdo->exec('unlock tables');