偏向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%';