MySQL學習筆記--事務。

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;	(回滾)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章