文章目錄
- 一、事務的概念
- 二、事務的特性
- 三、隱式事務和顯示事務
- 四、事務的步驟
- 五、三大范式
- 六、事務步驟演示
- 七、事務的隔離級別(面試常考)
- 八、演示savepoint的使用
一、事務的概念
事務:
一個或一組SQL陳述句組成一個執行單元,這個執行單元要么全部執行,要么全部不執行
二、事務的特性
ACID
原子性:一個事務不可再分割,要么都執行要么都不執行
一致性:一個事務執行會使資料從一個一致狀態切換到另外一個一致狀態
隔離性:一個事務的執行不受其他事務的干擾
持久性:一個事務一旦提交,則會永久的改變資料庫的資料事務的創建
三、隱式事務和顯示事務
隱式事務:事務沒有明顯的開啟和結束的標記
比如:insert、update、delete陳述句
delete from 表 where id=1;
顯示事務:事務具有明顯的開啟和結束的標記
前提:必須先設定自動提交功能為禁用
set autocommit=0#禁用事務
四、事務的步驟
步驟1:開啟事務
set autocommit=0;
start transaction;#可選的
步驟2:撰寫事務中的SQL陳述句(select insert update delete這幾個才可以撰寫事務,比如drop等就不行)
陳述句1;
陳述句2;
.....
步驟3:結束事務
commit;提交事務
rollback;回滾事務
savepoint 節點名;設定保存點
開啟事務的陳述句;
update 表 set 張三豐的余額=500 where name=‘張三豐’
update 表 set 郭襄的余額=1500 where name=‘郭襄’
結束事務的陳述句;
五、三大范式
第一范式: 列不可再分
第二范式:屬性完全依賴于主鍵
第三范式:屬性不依賴于其他的非主屬性,屬性直接依賴于主鍵
六、事務步驟演示
創建一個演示的表叫account
DROP TABLE IF EXISTS account;
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20),
balance DOUBLE
);
INSERT INTO account(username,balance)
VALUES('張無忌',1000),('趙敏',1000);
SELECT * FROM `account`;
#演示事務的使用步驟
#步驟1
SET autocommit=0;
START TRANSACTION;#可選的
#步驟2
UPDATE `account` SET `balance`=1000 WHERE `username`='張無忌';
UPDATE `account` SET `balance`=1000 WHERE `username`='趙敏';
#步驟3
#commit;
ROLLBACK;
七、事務的隔離級別(面試常考)
* 事務并發問題是如何產生的?
- 當多個事務同時操作同一個資料庫的相同資料時
* 事務并發問題
- 臟讀:一個事務讀取到了另外一個事務未提交的資料
- 不可重復讀:同一個事務中,多次讀取到的資料不一致
- 幻讀:一個事務讀取資料時,另外一個事務進行更新,導致第一個事務讀取到了沒有更新的資料
* 處理事務并發問題,設定事務隔離級別
- READ UNCOMMITTED
- READ COMMITTED:可以避免臟讀
- REPEATABLE READ:可以避免臟讀、不可重復讀和一部分幻讀
- SERIALIZABLE:可以避免臟讀、不可重復讀和幻讀`
* 注意:隔離級別從小到大安全性越來越高,但是效率越來越低
* 設定隔離級別
- set session|global transaction isolation level 隔離級別名;
* 查看隔離級別
- select @@tx_i
八、演示savepoint的使用
SELECT * FROM account;
SET autocommit=0;
START TRANSACTION;
DELETE FROM `account` WHERE id=1;
SAVEPOINT a;
DELETE FROM `account` WHERE id=2;
ROLLBACK TO a;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/351078.html
標籤:其他
上一篇:絕對路徑?models.FileFIeld的`upload_to`
下一篇:Django多用戶型別遷移錯誤
