事務是dbms得執行單位
開啟事務:
set autocommit=0; -- 取消自動提交
或begin; -- 手動開啟乙個事務
提交乙個事務
commit;
回滾乙個事務
rollback;
在mysql的innodb 引擎中,預設每個操作(insert,update,select [for update | lock in share mode],delete)都是乙個單獨的事務:
mysql> show variables like 'autocommit';
+---------------+-------+
| variable_name | value |
+---------------+-------+
| autocommit | on |
+---------------+-------+
1 row in set (0.00 sec)
auttocommit=on 表示把每乙個查詢當成乙個單獨的事務,並且自動提交; set auttocommit=0; 需要手動commit才會提交;
在事務中獲得的鎖都會等到事務提交或回滾時才會釋放
測試:create table `test_01` (
`id` int(11) unsigned not null auto_increment,
`a` int(11) unsigned default '0',
`d` int(11) unsigned default '0',
`c` varchar(120) default '0',
`e` varchar(3) not null default '0',
primary key (`id`),
key `k_a_c` (`a`,`c`) using btree
) engine=innodb auto_increment=7 default charset=utf8;
mysql> select * from test_01;
+----+------+------+----------+-----------+
| id | a | d | c | e |
+----+------+------+----------+-----------+
| 1 | 0 | 11 | qq | 中問 |
| 2 | 1 | null | abc | abc |
| 3 | 2 | null | bda | abc |
| 4 | 1 | null | asd | abc |
| 5 | 1 | null | 23adsf | 中a文 |
| 6 | 1 | null | asdfasdf | 中啊文 |
+----+------+------+----------+-----------+
update test_01 set d=21 where id=1;
開啟乙個終端連線
connection 1;
事務1;
-- set autocommit=0;
begin;
update test_01 set d=d-10 where id=1 and d>20;
show variables like 'autocommit';
-- rollback; 回滾事務或提交事務釋放事務中獲取的所有資源,包括鎖
-- commit;
開啟另乙個個終端連線
connection 2;
事務2;
-- set autocommit=0;
begin;
update test_01 set d=d-10 where id=1 and d>20; -- 這裡會等待獲取一把寫鎖,事務1提交後,這裡會接著往下執行
show variables like 'autocommit';
-- rollback;
-- commit;
update 全表和insert
事務1set autocommit=0;
begin;
update test_01 set a=1032;#鎖表
--update test_01 set a=1032 where id=1;#行鎖
事務2insert into test_01 (a) values(7);#這裡會因為事務1的update 全表而堵住
所以,為了提高mysql的寫入併發度,優化mysql update的where來降低鎖爭用是有一定效果的,比如對主鍵或唯一索引更新,但如果是普通索引則會鎖表
另外,insert的時候如果欄位有要給唯一索引字段賦值,則感覺兩個事務藐視不是透明,
create table `test_01` (
`id` int(11) unsigned not null auto_increment,
`a` int(11) default '0',
`d` int(11) unsigned default '0',
`c` varchar(120) default '0',
`e` varchar(3) not null default '0',
primary key (`id`),
unique key `uk_a` (`a`),
key `k_d` (`d`)
) engine=innodb auto_increment=49 default charset=utf8
1,set autocommit=0;
begin;
insert into test_01 (a,d) values(9,9);
2,insert into test_01 (a,d) values(7,9);#這裡不會會堵住
再來一組
1,set autocommit=0;
begin;
insert into test_01 (a,d) values(7,8);
2,insert into test_01 (a,d) values(7,9);#這裡會堵住
所以資料在插入的時候,好像可以看到其他事務對資料的修改,進而減少不必要的鎖
MySQL 事務和鎖
和其他資料庫相比,mysql的鎖機制比較假單,不同的引擎支援不同的鎖機制。myisam和memory使用表級鎖,bdb使用頁面鎖和表級鎖 innodb預設支援行級鎖,也支援表級鎖。myisam表鎖有兩中,乙個是都鎖,乙個是寫鎖,相容性如下 模式讀鎖 寫鎖讀鎖 相容不相容 寫鎖不相容 不相容 可見my...
Mysql 事務和鎖
是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成為事務,必須滿足所謂...
mysql事務和鎖
參考文章 1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程 錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 consistency 事...