事務:一個或一組SQL語句組成的一個執行單元,要麼所有成功,要麼所有失敗。sql
注:mysql中只有innodb支持事務數據庫
默認狀況下mysql的事務是自動提交的session
show variables like '%autocommit%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ #須要手動的禁用一下事務自動提交 set autocommit = 0; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | OFF | +---------------+-------+
#mysql8中查看隔離級別 select @@transaction_isolation; +-------------------------+ | @@transaction_isolation | +-------------------------+ | REPEATABLE-READ | +-------------------------+ #mysql8以前查看隔離級別 select @@tx_isolation;
#修改全局隔離級別 set global transaction isolation level read committed; #修改會話隔離級別 set session transaction isolation level read committed;
髒讀和幻讀類似,髒讀屬於修改操做,幻讀屬於插入操做併發
開啓兩個mysql鏈接,爲mysql1和mysql2性能
原始數據爲測試
select * from users; +----+---------+ | id | u_name | +----+---------+ | 2 | 張三 | | 3 | 張三0 | | 4 | 張三1 | | 5 | 張三2 | +----+---------+
#首先設置mysql1和mysql2隔離級別爲read uncommited set session transaction isolation level read uncommitted; #禁用mysql1 mysql2的自動提交 set autocommit = 0; update users set u_name='李四' where id = 3;#① mysql1修改數據但未提交 select * from users where id =3;#② mysql1 查詢數據 爲李四 select * from users where id =3;#③ mysql2 查詢數據 也爲李四 查詢到了mysql1中未提交的數據 出現了髒讀 insert into users (u_name) values ('劉亦菲');#④mysql1 插入數據但未提交 select * from users where u_name = '劉亦菲';#⑤mysql1 查詢到該數據 select * from users where u_name = '劉亦菲';#⑥mysql2 查詢到該數據 出現了幻讀 rollback;#⑦mysql1 回滾以前的操做 此時mysql2在查詢發現以前查詢到的數據都變了 出現了不可重複讀
#首先設置mysql1和mysql2隔離級別爲read commited set session transaction isolation level read committed; #禁用mysql1 mysql2的自動提交 set autocommit = 0; update users set u_name='李四' where id = 3;#① mysql1修改數據但未提交 select * from users where id =3;#② mysql1 查詢數據 爲李四 select * from users where id =3;#③ mysql2 查詢數據 爲張三0 沒有出現髒讀 insert into users (u_name) values ('劉亦菲');#④mysql1 插入數據但未提交 select * from users where u_name = '劉亦菲';#⑤mysql1 查詢到該數據 select * from users where u_name = '劉亦菲';#⑥mysql2 沒有查詢到該數據 commit;#⑦mysql1 提交以前的操做 此時mysql2在查詢發現以前查詢到的數據都變了 出現了不可重複讀
#首先設置mysql1和mysql2隔離級別爲read commited set session transaction isolation level read committed; #禁用mysql1 mysql2的自動提交 set autocommit = 0; update users set u_name='李四' where id = 3;#① mysql1修改數據但未提交 select * from users where id =3;#② mysql1 查詢數據 爲李四 select * from users where id =3;#③ mysql2 查詢數據 爲張三0 沒有出現髒讀 insert into users (u_name) values ('劉亦菲');#④mysql1 插入數據但未提交 select * from users where u_name = '劉亦菲';#⑤mysql1 查詢到該數據 select * from users where u_name = '劉亦菲';#⑥mysql2 沒有查詢到該數據 commit;#⑦mysql1 提交以前的操做 此時mysql2在查詢發現以前查詢到的數據都變了 出現了不可重複讀
#首先設置mysql1和mysql2隔離級別爲repeatable read set session transaction isolation level repeatable read; #禁用mysql1 mysql2的自動提交 set autocommit = 0; update users set u_name='李四' where id = 3;#① mysql1修改數據但未提交 select * from users where id =3;#② mysql1 查詢數據 爲李四 select * from users where id =3;#③ mysql2 查詢數據 爲張三0 沒有出現髒讀 insert into users (u_name) values ('劉亦菲');#④mysql1 插入數據但未提交 select * from users where u_name = '劉亦菲';#⑤mysql1 查詢到該數據 select * from users where u_name = '劉亦菲';#⑥mysql2 沒有查詢到該數據 commit;#⑦mysql1 提交以前的操做 此時mysql2仍是沒有數據
在一個事務中能夠設置保存點,和rollback搭配使用code
select * from users; +------+-----------+ | id | u_name | +------+-----------+ | 2 | 張三 | | 3 | 李四 | | 4 | 張三1 | | 5 | 張三2 | | 1006 | 劉亦菲 | +------+-----------+ delete from users where id = 4; savepoint a;#設置保存點 delete from users where id = 1006; rollback to a;#回滾到保存點的位置 select * from users; +------+-----------+ | id | u_name | +------+-----------+ | 2 | 張三 | | 3 | 李四 | | 5 | 張三2 | | 1006 | 劉亦菲 | +------+-----------+
因爲自己的博客百度沒有收錄,博客地址http://zhhll.icu事務