鎖機制:
當客戶端操作表(記錄)時,為了保證操作的隔離性(多個客戶端操作不能相互影響),通過加鎖來處理。
操作方面:
讀鎖:讀操作時增加的鎖,也叫共享鎖,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,'[email protected]',4),
(null,'xiaohong',13,'[email protected]',2),
(null,'xiaolong',31,'[email protected]',2),
(null,'xiaofeng',22,'[email protected]',3),
(null,'xiaogui',42,'[email protected]',3);
新增鎖的語法: lock table table_name1 read|write,table_name2 read|write注意:新增讀鎖後,自己和其他的程序(使用者)只能對該錶查詢操作,自己也不能執行修改操作。自己查詢會直接報錯,其他使用者查詢會產生阻塞情況。新增表的鎖定後,針對鎖表的使用者,只能操作鎖定的表,不能操作沒有鎖定的表。新增寫鎖,只有鎖表的客戶可以操作(讀寫)這個表,其他客戶讀都不能讀。2、行鎖釋放鎖的語法:unlock tables
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');
MySQL資料庫的鎖機制
原文首發於 本文出自 rebornchang的部落格 拋開資料庫引擎說資料庫鎖機制的都是流氓 引言 mysql資料庫的引擎分為三種,myisam isam innodb以及memory,具體的引擎型別效能比較可以baidu到,這裡就不多說了,本文中所說的鎖機制基於innodb引擎,那為啥說基於inn...
MySQL資料庫的鎖機制
在併發訪問情況下,很有可能出現不可重複讀等等讀現象。為了更好的應對高併發,封鎖 時間戳 樂觀併發控制 樂觀鎖 悲觀併發控制 悲觀鎖 都是併發控制採用的主要技術方式。按操作劃分 dml鎖,ddl鎖 按鎖的粒度劃分 表級鎖 行級鎖 頁級鎖 按鎖級別劃分 共享鎖 排他鎖 按加鎖方式劃分 自動鎖 顯示鎖 按...
資料庫(七) MySQL鎖機制
資料庫的樂觀鎖和悲觀鎖?mysql 中有哪幾種鎖,列舉一下?mysql中innodb引擎的行鎖是怎麼實現的?mysql 間隙鎖有沒有了解,死鎖有沒有了解,寫一段會造成死鎖的 sql 語句,死鎖發生了如何解決,mysql 有沒有提供什麼機制去解決死鎖 鎖是計算機協調多個程序或執行緒併發訪問某一資源的機...