mysql学习笔记-事务
事務的基本要素
MySQL 事務主要用于處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你即需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
- 在 MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。
- 事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要么全部執行,要么全部不執行。
- 事務用來管理 insert,update,delete 語句
一般來說,事務是必須滿足4個條件(ACID):原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
-
原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
-
一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。
-
隔離性:數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
-
持久性:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
?
MYSQL 事務處理主要有兩種方法:
1、用 BEGIN, ROLLBACK, COMMIT來實現
- BEGIN?開始一個事務
- ROLLBACK?事務回滾
- COMMIT?事務確認
2、直接用 SET 來改變 MySQL 的自動提交模式:
- SET AUTOCOMMIT=0?禁止自動提交
- SET AUTOCOMMIT=1?開啟自動提交
3、保留點 SAVEPOINT,前提SET AUTOCOMMIT=0?禁止自動提交
SAVEPOINT savepoint_name; // 聲明一個 savepointROLLBACK TO savepoint_name; // 回滾到savepointRELEASE SAVEPOINT savepoint_name; // 刪除指定保留點
以下代碼在程序中未實現保留點回滾功能,設置SET AUTOCOMMIT=0?禁止自動提交 后才能實現:
DROP TABLE emp; CREATE TABLE emp(empno INT(10), ename VARCHAR(10), deptno INT(5));-------------- 事務保存點,可以用于來保存事務--------------------- insert into emp (empno, ename, deptno) values (9950, '1111', 40);-- 事務保存到事務保存點 savepoint p1;insert into emp (empno, ename, deptno) values (9940, '2222', 60); select * from emp; commit;-- 回滾到事務保存點,所以事務提交了,就不能回滾到這個事務中的某一個事務保存點 rollback to p1; select * from emp;-- 回滾到事務保存點p1開始的狀態 rollback; select * from emp;?
事務的并發問題
1、臟讀:事務A讀取了事務B更新的數據,然后B回滾操作,那么A讀取到的數據是臟數據
2、不可重復讀:事務 A 多次讀取同一數據,事務 B 在事務A多次讀取的過程中,對數據作了更新并提交,導致事務A多次讀取同一數據時,結果 不一致。
3、幻讀:系統管理員A將數據庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束后發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。
小結:不可重復讀的和幻讀很容易混淆,不可重復讀側重于修改,幻讀側重于新增或刪除。解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
?
?MySQL事務隔離級別
轉載于:https://www.cnblogs.com/shishibuwan/p/10910653.html
總結
以上是生活随笔為你收集整理的mysql学习笔记-事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IntelliJ IDEA 2019 激
- 下一篇: mysql提示错误[Error Code