是數據庫區別于文件系統的重要特性之一,用于保證數據庫的完整性,數據庫會從一種一致性狀態轉換為另一種一致性狀態。
1、四大特性
(1) 原子性
數據庫的每個事務都是不可分割的單元,只有事務中的所有 SQL 語句都執行成功,才算整個事務成功,如果事務中有一個 SQL 語句執行失敗,整個事務都將回滾。
(2) 一致性
數據庫從一種一致性狀態轉換為另一種一致性狀態,即數據庫的完整性約束沒有被破壞,要么都是新數據,要么都是老數據。
(3) 隔離性
一個事務的影響在該事務提交之前對其他事務都是不可見的,通過鎖機制來實現。
(4) 持久性
事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
2、語法:
在 MySQL 命令行默認設置下,事務是自動提交的,即執行了 SQL 語句之后馬上會執行 commit 操作,可以通過 set autocommit = 0 來禁用當前會話的自動提交。
(1) 開始事務
begin 或 start transaction
(2) 提交事務
commit,即 commit [work]
(3) 事務回滾
rollback,即 rollback [work]
(4) 定義保存點
savepoint xxx,一個事務中可以有多個保存點
(5) 刪除保存點
release savepoint xxx,保存點不存在時會拋出異常
(6) 回滾到某個保存點
rollback to [savepoint] xxx
回滾到某個保存點并不能讓事務結束,要提交事務或回滾事務。
3、InnoDB 的實現
隔離性由鎖機制實現,原子性、一致性、持久性都是通過數據庫的 redo 日志和 undo 日志來完成。
redo 日志:重做日志,它記錄了事務的行為;
undo 日志:對數據庫進行修改時會產生 undo 日志,也會產生 redo 日志,使用 rollback 請求回滾時通過 undo 日志將數據回滾到修改前的樣子。
InnoDB 存儲引擎回滾時,它實際上做的是與之前相反的工作,insert 對應 delete,delete 對應insert,update 對應相反的 update。
ps:
1、commit 和 commit work 的區別
commit work 可以控制事務接收后的行為,可以用 select @@completion_type 查看值,默認是0。
completion_type = 0,兩者等價。
completion_type = 1,commit work 等價于 commit and chain,表示馬上開啟一個相同隔離級別的事務。
completion_type = 2,commit work 等價于 commit and release,表示事務提交后自動斷開與服務器的連接。
2、隱式提交
有些語句會造成隱式提交,主要有3類:
(1) DDL 語句:create event、create index、alter table、create database、truncate 等等,所有 DDL 語句都是不能回滾的。
(2) 權限操作語句:create user、drop user、grant、rename user 等等。
(3) 管理語句:analyze table、check table 等等。
3、隔離級別
通過鎖機制實現,大部分數據庫都沒有提供真正意義上的隔離性。
數據庫制造商在標準和性能之間進行了權衡,MySQL 還是比較貼近該標準的,ISO 和 ANSI SQL 標準了四種事務隔離級別的標準。
可以用 select @@tx_isolation 來查看它的值。
(1) read uncommitted
隔離級別最低,開銷也是最小,目前沒有數據庫會設置它為默認隔離級別,因為會出現臟讀。
臟讀:讀到未提交的數據(臟數據),n 事務中讀到 m 事務中修改了,但未提交的數據,即在不同事務下可以讀到其它事務未提交的數據。
嚴格來說,它已經破壞了事務的隔離性。
(2) read committed
它不允許在別的事務未提交時讀取到別的事務的修改數據,容易出現不可重復讀,但是可以被人們接受,因為事務已經提交,數據已經持久化到磁盤了,隔離級別越低,事務請求的鎖就越少,或者保持鎖定的時間就越短,這也是大多數數據庫默認的事務隔離級別都是 read committed 的原因。
不可重復讀:在一個事務中多次讀同一個數據,由于其他事務在第一個事務還沒結束時修改了數據,造成第一個事務中兩次讀到的數據不一致。
臟讀與不可重復讀:臟讀讀取的是未提交的數據,不可重復讀讀到的是已提交的數據。
(3) repeatable read
InnoDB 存儲引擎默認支持的隔離級別。不會出現臟讀、不可重復讀和幻讀(InnoDB 避免了該問題)。
(4) serializable
SQL 和 SQL2 標準的默認事務隔離級別,它是真正意義上的隔離,當然性能也是最差。
設置事務隔離級別:
set [global|session] transaction isolation level {read uncommitted|...};
比如:set tx_isolation='read-committed';
- 數據庫
- CAP定理
- 關系模型
- 關系數據庫
- NoSQL
- ODBC
- JDBC
- ODBC、JDBC和四種驅動類型
- mysql
- 安裝與配置
- CentOS 7 安裝 MySQL
- 優化
- 比較全面的MySQL優化參考
- 1、硬件層相關優化
- 1.1、CPU相關
- 1.2、磁盤I/O相關
- 2、系統層相關優化
- 2.1、文件系統層優化
- 2.2、其他內核參數優化
- 3、MySQL層相關優化
- 3.1、關于版本選擇
- 3.2、關于最重要的參數選項調整建議
- 3.3、關于Schema設計規范及SQL使用建議
- 3.4、其他建議
- 后記
- Mysql設計與優化專題
- ER圖,數據建模與數據字典
- 數據中設計中的范式與反范式
- 字段類型與合理的選擇字段類型
- 表的垂直拆分和水平拆分
- 詳解慢查詢
- mysql的最佳索引攻略
- 高手詳解SQL性能優化十條經驗
- 優化SQL查詢:如何寫出高性能SQL語句
- MySQL索引原理及慢查詢優化
- 數據庫SQL優化大總結之 百萬級數據庫優化方案
- 數據庫性能優化之SQL語句優化1
- 【重磅干貨】看了此文,Oracle SQL優化文章不必再看!
- MySQL 對于千萬級的大表要怎么優化?
- MySQL 數據庫設計總結
- MYSQL性能優化的最佳20+條經驗
- 數據操作
- 數據語句操作類型
- DCL
- 修改Mysql數據庫名的5種方法
- DML
- 連接
- 連接2
- DDL
- 數據類型
- 字符集
- 表引擎
- 索引
- MySQL理解索引、添加索引的原則
- mysql建索引的幾大原則
- 淺談mysql的索引設計原則以及常見索引的區別
- 常用工具簡介
- QA
- MySQL主機127.0.0.1與localhost區別總結
- 視圖(view)
- 觸發器
- 自定義函數和存儲過程的使用
- 事務(transaction)
- 范式與反范式
- 常用函數
- MySQL 數據類型 詳解
- Mysql數據庫常用分庫和分表方式
- 隔離級別
- 五分鐘搞清楚MySQL事務隔離級別
- mysql隔離級別及事務傳播
- 事務隔離級別和臟讀的快速入門
- 數據庫引擎中的隔離級別
- 事務隔離級別
- Innodb中的事務隔離級別和鎖的關系
- MySQL 四種事務隔離級的說明
- Innodb鎖機制:Next-Key Lock 淺談
- SQL函數和存儲過程的區別
- mongo
- MongoDB設置訪問權限、設置用戶
- redis
- ORM
- mybatis
- $ vs #
- mybatis深入理解(一)之 # 與 $ 區別以及 sql 預編譯
- 電商設計
- B2C電子商務系統研發——概述篇
- B2C電子商務系統研發——商品數據模型設計
- B2C電子商務系統研發——商品模塊E-R圖建模
- B2C電子商務系統研發——商品SKU分析和設計(一)
- B2C電子商務系統研發——商品SKU分析和設計(二)
- 數據庫命名規范--通用