mysql事務
一、定義與解決問題
mysql中,事務是一個最小的不可分割的工作單元。事務能夠保證一個業務的完整性。
比如我們的銀行轉賬:
a->-100
updata user set money =money -100 where name='a';
b->+100
updata user set money=money+100 where name='b';
實際的程序中,如果只有一條語句執行成功,而另一條沒有執行成功,就會出現數據前後不一致。
像這種,多條sql語句,可能會有同時成功的要求,要麼就同時失敗。
二、mysql中如何控制事務?
1、mysql默認是開啓事務的(自動提交)
即系統中 autocommit=1;
2、默認事務開啓的作用是什麼?
當我們去執行一個sql語句的時候,效果會立即體現出來,且不能回滾(事務回滾,撤銷sql語句執行效果)。
create database bank;
create table user(
id int peimary key,
name varchar(20),
money int
);
insert into user values(1,'a','1000');
所有即使執行 rollback; 也不能撤銷上一步操作。
要執行撤銷操作,應手動設置 關閉mysql的自動提交
set autocommit=0;
如果關閉了自動提交,輸入rollback;便可以進行回滾。
三、事務提交方式
(1)自動提交
系統的自動提交 autocommit=1;
不可以回滾。
(2)手動提交
手動設置 set autocommit=0;
然後手動提交 commit;
(3)事務回滾
rollback;
四、事務給我們提供了一個返回的機會。也就是手動提交方式。
(1)手動開啓事務
begin 或者
start transaction;都可以幫我們手動開啓一個事務。
例:begin;
updata user set money =money -100 where name='a';
updata user set money =money -100 where name='b';
或者:
start transaction;
updata user set money =money -100 where name='a';
updata user set money =money -100 where name='b';
(2)事務開啓之後,一旦提交(commit)之後就不能回滾了(rollback)。
例:
begin;
updata user set money =money -100 where name='a';
updata user set money =money -100 where name='b';
此時 rollback;無效。
四、 事務的四大特徵:
A 原子性:
事務是最小的單位,不可以分割。
I 隔離性:
事務1和事務2之間具有隔離性。
1、如何查看mysql的隔離級別
mysql 8.0;
select @@global.transcation_isolation;
mysql 5.x;
select @@global.tx_isolation;
2、如何修改隔離級別?
set global transaction isolation level read uncommitted;
修改爲 可以讀未被提交的級別。
3、隔離級別
1、read uncommitted; 讀未提交的(讀未被提交的事務叫做髒讀,實際開發中不被允許。)
會出現的問題:如果有事務a和事務b,在操作過程中,事務沒有被提交,但是b可以看見a的操作結果。
2、read cmmitted; 讀已經提交的(問題:不可重複讀。)
會出現的問題:事務a在進行查詢操作時,事務b修改了表中的數據,事務b修改的數據被事務a讀到了。但是在上一步查詢中並沒有顯示,叫做不可重複讀。
3、repeatable read; 可以重複讀(可能會出現:幻讀)
會出現的問題:事務a和事務b同時操作一張表,事務a提交的數據,也不能被事務b讀到,就可以造成幻讀。
4、serializable; 串行化
優點:當表被第二個事務操作時,若第一個事務未被提交,是不可進行的,就會進入排隊狀態。
會出現問題: 串行化性能特差!
性能排行 1>2>3>4.
默認隔離是 repeatable read
C 一致性:
事務要求,同一事務中的sql語句,必須保證同時成功或者同時失敗。
D 持久性
事務一旦結束(commit,rollback),就不可以返回。
一旦commit;就不能rollback; 一旦rollback;就不能commit;
五、事務開啓:
方式(1):
修改默認提交
set autocommit=0;
方式(2):
begin;
方式(3):
start transaction;
六、事務手動提交與回滾
commit;(手動提交)
rollback; (回滾)