mysql 事務和鎖

2021-06-28 04:39:34 字數 3172 閱讀 6572

事務是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 事...