事務的4大特徵(原子性、持久性、隔離性、一致性) 事務的隔離級別(讀未提交、 讀已提交、可重複讀、 串行化)

1)事務的基本介紹: 
	(1)介紹:如果包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗
		如:張三給李四轉賬500元,3個業務操作
			1.查詢張三賬戶餘額是否大於500
			2.張三賬戶 金額-500
			3.李四賬戶 金額+500
	
			但是: 如果這3個操作沒有被事務管理的話,某一步出現了異常,500元就不翼而飛了.
			
			演示:
				
				start transaction;
				
				update account set balance = balance - 500 where name = 'zhangsan';
				異常
				update account set balance = balance + 500 where name = 'lisi';
				
				rollback; -- 回滾
				
				commit;   -- 提交
		
	(2)操作
		控制檯默認編碼是gbk 數據是:utf8  中文的話,是會亂碼;
		
		開啓事務:start transaction
		回滾:rollback
		提交:commit
		
	(3)mysql中,事務默認自動提交一次事務
		事務提交的2種方式:
			自動提交: mysql就是自動提交的(也就是每個sql語句,都會提交一次事務)
			手動提交: 需要先開啓事務,再提交

		查詢提交方式:
			select @@autocommit;  --1 自動提交  0手動提交
			修改默認提交方式: set @@autocommit = 0;

2)事務的4大特徵
	(1)原子性: 是不可分割的最小單位
	(2)持久性: 如果事務提交或者回滾,那麼數據庫的表數據會持久的更新。 哪怕你關機了, 數據也會持久保存在硬盤上。
	(3)隔離性:多個事務之間,相互獨立。但是實際會產生影響,所以要了解事務的隔離級別
	(4)一致性:事務操作前後數據總量不變

3)事務的隔離級別(瞭解)
	(1)概念: 多個事務之間是隔離的,相互獨立的,但是如果多個事務操作同一批數據,則會引發一些問題,設置不同的隔離級別就可以解決這些問題。
	(2)存在的問題:
		1.髒讀:一個事務,讀取到另一個事務中沒有提交的數據
		2.不可重複讀(虛讀):在同一個事務中,2次讀取到的數據不一樣
		3.幻讀(mysql中看不到這種情況):一個事務操作(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改。
	(3)4種隔離級別:
		1.read uncommitted: 讀未提交
			產生的問題: 髒讀、不可重複讀、幻讀
		2.read committed: 讀已提交(已提交的數據,另一個事務才能讀到) oracle默認
			產生的問題: 不可重複讀、幻讀
		3.repeatable-read(可重複讀):  mysql默認
			產生的問題: 幻讀
		4.serializable: 串行化(跟多線程加鎖一樣)
			可以解決所有的問題
			
		注意: 隔離級別從小到大,安全性越來越高,但是效率越來越低
		
4)數據庫設置默認隔離級別:
	(1)查詢隔離級別: select @@tx_isolation;
	
	(2)設置隔離級別: set global transaction isolation level 級別字符串;
	
5)演示(關鍵:在commit 前後,2個窗口進行查看;):

	---1---
	set global transaction isolation level read uncommitted;
	start transaction;
	update account set balance = balance - 500 where id = 1;
	update account set balance = balance + 500 where id = 2;

	
	
	1號窗口:左邊轉賬不提交
	2號窗口: 查詢了,就直接查詢到了1沒有提交的事務.
	1回滾後,2去取錢,發現取不出來
	--》髒讀 和 不可重複度發生了


	---2---
	比如:我給領導看報表


	---3---
	當2號窗口commit後,才能查詢到1號窗口的更改
	
	---4---
	當1號窗口提交或者回滾後, 2號窗口的select才能查詢出來。 不然光標一直等着
	









 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章