MySQL:事物

事務

1. 事務的基本介紹

	1. 概念:
		*  如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。
		
	2. 操作:
		1. 開啓事務: start transaction;
		2. 回滾:rollback;
		3. 提交:commit;
	3. 例子:
		CREATE TABLE account (
			id INT PRIMARY KEY AUTO_INCREMENT,
			NAME VARCHAR(10),
			balance DOUBLE
		);
		-- 添加數據
		INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
		
		
		SELECT * FROM account;
		UPDATE account SET balance = 1000;
		-- 張三給李四轉賬 500 元
		
		-- 0. 開啓事務
		START TRANSACTION;
		-- 1. 張三賬戶 -500
		
		UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
		-- 2. 李四賬戶 +500
		-- 出錯了...
		UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
		
		-- 發現執行沒有問題,提交事務
		COMMIT;
		
		-- 發現出問題了,回滾事務
		ROLLBACK;
	4. MySQL數據庫中事務默認自動提交
		
		* 事務提交的兩種方式:
			* 自動提交:
				* mysql就是自動提交的
				* 一條DML(增刪改)語句會自動提交一次事務。
			* 手動提交:
				* Oracle 數據庫默認是手動提交事務
				* 需要先開啓事務,再提交
		* 修改事務的默認提交方式:
			* 查看事務的默認提交方式:SELECT @@autocommit; -- 1 代表自動提交  0 代表手動提交
			* 修改默認提交方式: set @@autocommit = 0;

2. 事務的四大特徵:

	1. 原子性:是不可分割的最小操作單位,要麼同時成功,要麼同時失敗。
	2. 持久性:當事務提交或回滾後,數據庫會持久化的保存數據。
	3. 隔離性:多個事務之間。相互獨立。
	4. 一致性:事務操作前後,數據總量不變

3. 事務的隔離級別(瞭解)

	* 概念:多個事務之間隔離的,相互獨立的。但是如果多個事務操作同一批數據,則會引發一些問題,設置不同的隔離級別就可以解決這些問題。
	* 存在問題:
		1. 髒讀:一個事務,讀取到另一個事務中沒有提交的數據
		2. 不可重複讀(虛讀):在同一個事務中,兩次讀取到的數據不一樣。
		3. 幻讀:一個事務操作(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改。
	* 隔離級別:
		1. read uncommitted:讀未提交
			* 產生的問題:髒讀、不可重複讀、幻讀
		2. read committed:讀已提交 (Oracle)
			* 產生的問題:不可重複讀、幻讀
		3. repeatable read:可重複讀 (MySQL默認)
			* 產生的問題:幻讀
		4. serializable:串行化
			* 可以解決所有的問題

		* 注意:隔離級別從小到大安全性越來越高,但是效率越來越低
		* 數據庫查詢隔離級別:
			* select @@tx_isolation;
		* 數據庫設置隔離級別:
			* set global transaction isolation level  級別字符串;

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