MySQL資料庫事務筆記
事務是一組有著內在邏輯聯系的sql陳述句,
事務是對系統進行的操作,為了保證系統的完整性,
文章目錄
- MySQL資料庫事務筆記
- 前言
- 一、事務的四個特性:
- 二、事務的隔離級別:
- 三:事務的日志
- 四:事務的隔離性:
- 總結
前言
提示:下面的例子可能只有我自己能看懂,不懂可以問我,
還有MySQL5.0如何查看隔離級別由于我用的是8.0所以我沒寫出來 ,想知道可以評論提問,
一、事務的四個特性:
**
1. 原子性:
** 事務是最小的單位,不可以在分割,
原子性是指資料庫事務是不可分割的操作單位,
2. 一致性:
一個事務包括多個操作,這些操作要么全部執行,要么全部不執行,
一致性是指事務將資料庫從一種狀態變成另一種狀態,在事務開始之前和事務結束之后,資料的完整性沒有被破壞,
事務的一致性決定了一個系統設計和實作的復雜度,
3. 隔離性
隔離性要求每個讀寫事務的物件與其他事務的操作物件能相互分離,即該事務提交前對其他事務都不可見,通常使用鎖來實作,
4、持久性:
事務一旦結束,就不可以回傳,
事務提交對系統的永久的,
二、事務的隔離級別:
1.事務的四個隔離級別(后面有更詳細):
1.未提交讀
就是一個事務可以讀取另一個未提交事務的資料
2. 已提交讀
就是一個事務要等另一個事務提交后對讀取資料,
3. 可重復讀
開始讀取資料,不再允許修改操作
4. 可序列化
在該級別下,事務串行化順序執行,
三:事務的日志
(1). Redo 日志:
事務執行時需要將執行的事務日志寫入到日志檔案里,對應的檔案為redo 日志,
當每條sql進行資料庫更新操作時,首先將redo 日志寫入到日志緩沖區, 當客戶端執行commit 命令提交時,日志緩沖區的內容將被重繪到磁盤,日志緩沖區的重繪方式和時間間隔可以通過引數控制,
(2).undo日志:
與redo 日志相反,undo 日志主要用于事務例外時的資料回滾,具體內容就是復制事務前的資料庫內容到undo 緩沖區,然后在合適的時間將內容重繪到磁盤,
四:事務的隔離性:
1. read uncommitted; 讀未提交的
2. read committed; 讀已經提交的
3. repeatable read; 可以重復讀
4.serializable; 串行化
1-1 read uncommitted
如果有事務a,和事務B,A事務對資料進行操作,在操作的程序 中,事務沒有被提交,但是B可以看見a的操作的結果,
如何查看資料庫的隔離級別:
Mysql 8.0
系統級別的
**Select @@global.transaction_isolation;**
會話級別的
**Select @@transaction_isolation;**
MYSQL 默認隔離級別:
Repeatable-read
修改隔離級別:
**set global(取鍵) transaction isolation level read 要修改的狀態((un)committed);**
轉賬的一個例子:
start transaction ;
update user1 set money=money-800 where name='Ming';
update user1 set money=money+800 where name='TaoBao';
之后進行事務回滾,之前的資料就會不變,
如果兩個不同的地方,都在進行操作,如果事務a 開啟之后,他的資料可以被其他事務讀取到 ,
這樣就會出現(臟讀)
臟讀:一個事務讀到了另外一個事務沒有提交的資料,就叫做臟讀,(實際開發中不允許出現)
2. read committed; 讀已經提交的
如何修改隔離級別:
set global(取鍵) transaction isolation level read 要修改的狀態((un)committed);
然后查看:
**Select @@global.transaction_isolation;**
Start transaction;
Select * from user1;
雖然我只能讀到另外一個事務提交的資料,但還是會出現問題,就是
讀取同一個表的資料,發現前后不一致,
會出現不可重復讀現象:read committed
3. repeatable read; 可以重復讀
先修改隔離級別:
Set global transaction isolation level read committed;
Select @@global.transaction_isolation;
這個隔離級別會出現的問題:
這里會出現一個現象叫做幻讀!!
事務A和事務B同時操作一張表,事務A提交的資料,也不能被事務B讀到,就可以造成幻讀,
4.serializable; 串行化
修改隔離級別為串行化:
Set global transaction isolation level serializable;
Select @@global.transaction_isolation;
Sql陳述句被卡住了
Mysql>insert into user1 values(8,’Ming’,200);
當user1 表被另外一個事務操作的時候,其他事務里面的寫操作,是不可以進行的,
進入排隊狀態(串行化),指導a那邊事務結束之后,b這個的寫入操作才會執行,
串行化問題是,性能特差!!
Read-uncommitted > read-committed > repeatable-read > serializable;
隔離級別越高,性能越差,
Mysql 默認隔離級別是 Repeatable-read
總結
1. 啟動事務:
MySQL的事務是默認提交的,MySQL中使用start transaction 或 begin 陳述句可以顯示控制一個事務的開始,
Start transaction
MySQL中不允許事務的嵌套,若在第1個事務中使用start transaction 命令,當第2 個事務開啟時,系統會自動提交第1個事務,
2. 提交事務:
MySql使用commit 或者 commit work 陳述句提交事務,提交事務后,對資料庫的修改是永久性的,
COMMIT;
3. 回滾事務:
MySQL中,使用rollback 或者rollback work 陳述句回滾事務,回滾事務會撤銷正在進行的所有未提交的修改,語法:
Rollback
或者 xact_abort
回滾產生錯誤的Transact-SQL陳述句,而事務將繼續進行處理,(注:錯誤嚴重或者語法錯誤時可能回滾整個事務)
4. 事務保存點:
除了啟動事務,提交事務,回滾事務外,在事務中還可以設定保存點savepoint 可以將處理的事務回滾至保存點,
(1). Savepoint identifier
允許在事務中創建一個保存點,一個事務中可以有多個保存點,
(2). Release savepoint identifier
洗掉一個事務的保存點,當沒有一個保存點時執行此陳述句會拋出一個例外,
(3). Rollback to identifier
如果給出savepoint ,可以把事務回滾到savepoint 指定的保存點,如果回滾到一個不存在的保存點,會拋出例外,如果不給出savepoint ,則回滾到啟動事務之前的狀態,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/279651.html
標籤:其他
上一篇:SQL練習——2020滴滴面試題
下一篇:關系資料庫理論(一)
