偏向MyISAM存储引擎,开销小,加锁快,不会出现死锁;锁定力度大,发生锁冲突几率高,并发度最低。sql
#加锁方式 lock table 表名1 read(write),表名2 read(write); #查看表上加过的锁 0表示未上锁 show open tables; #释放锁 unlock tables;
create table mylock ( id int not null primary key auto_increment, name varchar(20) default '' ) engine myisam; insert into mylock(name) values('a'); insert into mylock(name) values('b'); insert into mylock(name) values('c'); insert into mylock(name) values('d'); insert into mylock(name) values('e'); select * from mylock;
#给mylock表加读锁 lock table mylock read; #查询mylock表 能够展现全部数据 select * from mylock; #在当前会话中不能读取别的表:Table 'tbl_emp' was not locked with LOCK TABLES select * from tbl_emp;
#能够查询 select * from mylock; #修改mylock表会出先等待,直到mylock表释放锁 update mylock set name='aaa' where id = 1;
#给mylock表加写锁 lock table mylock write; #查询mylock表 能够展现全部数据 select * from mylock; #在当前会话中不能读取别的表:Table 'tbl_emp' was not locked with LOCK TABLES select * from tbl_emp;
#在session 2中没法读取数据和更新数据,一直阻塞;直到session中unlock tables解锁 select * from mylock;
事务是由一组SQL语句组成的逻辑处理单元,事务具备如下4个属性,一般简称为事务的ACID属性。数据库
MySQL查看事务隔离级别:show variables like 'tx_isolation';session
隔离级别
|
隔离级别的值
|
致使的问题
|
用例
|
Read-Uncommitted(读未提交)
|
0
|
有脏读
|
|
Read-committed(读提交)
|
1
|
无脏读,容许不可重复读和幻读
|
SqlServer、Oracle
|
Repeatable-read(重复读)
|
2
|
无脏读和不可重复读,容许幻读
|
Mysql InnoDB
|
Serializable (序列化)
|
3
|
均可以免,执行效率慢,慎用
|
CREATE TABLE test_innodb_lock (a INT(11),b VARCHAR(16))ENGINE=INNODB; INSERT INTO test_innodb_lock VALUES(1,'b2'); INSERT INTO test_innodb_lock VALUES(3,'3'); INSERT INTO test_innodb_lock VALUES(4, '4000'); INSERT INTO test_innodb_lock VALUES(5,'5000'); INSERT INTO test_innodb_lock VALUES(6, '6000'); INSERT INTO test_innodb_lock VALUES(7,'7000'); INSERT INTO test_innodb_lock VALUES(8, '8000'); INSERT INTO test_innodb_lock VALUES(9,'9000'); INSERT INTO test_innodb_lock VALUES(1,'b1'); CREATE INDEX test_innodb_a_ind ON test_innodb_lock(a); CREATE INDEX test_innodb_lock_b_ind ON test_innodb_lock(b);
操做同一行数据时:当上一个事务修改未提交时,第二个事务也去修改会处于阻塞。数据结构
操做不一样行时:即便上一个事务修改未提交,第二个事务也能修改,互不影响。并发
修改 test_innodb_lock 中的数据,varchar 不用 ’ ’ ,致使系统自动转换类型,致使索引失效,会出现表锁。性能
select xxx ... for update
锁定某一行后,其它的操做会被阻塞,直到锁定行的会话提交commit。优化
show status like 'innodb_row_lock%';