來自https://gist.github.com/JagoWang/4555317
TRANSACTION(事務隔離級別)
1. ISOLATION_DEFAULT:這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別。
每種數據庫的默認隔離級別是不同的,例如SQL Server、Oracle默認Read Commited,MySQL默認Repeatable Read。
另外四個與JDBC的隔離級別相對應,不同的隔離級別采用不同的鎖類型來實現,在四種隔離級別中,Serializable的
隔離級別最高,Read Uncommited的隔離級別最低。
2. ISOLATION_READ_UNCOMMITTED:讀未提交數據,這是事務最低的隔離級別,在并發的事務中,它充許一個事務可以
讀到另一個事務未提交的更新數據。(會出現臟讀,不可重復讀和幻讀)
3. ISOLATION_READ_COMMITTED:讀已提交數據,保證在并發的事務中,一個事務修改的數據提交后才能被另外一個事
務讀取到。(會出現不可重復讀和幻讀)
4. ISOLATION_REPEATABLE_READ:可重復讀,這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻讀。一般
是采用“快照”的方式來實現的。
5. ISOLATION_SERIALIZABLE:事務被處理為順序執行。這是花費最高,但也是最可靠的事務隔離級別。能有效的避免臟讀、
不可重復讀、幻讀。
臟讀、不可重復讀、幻讀的概念
臟讀:一個事務讀取到另一事務未提交的更新新據。當一個事務正在訪問數據,并且對數據進行了修改,而這種修改還沒有
提交到數據庫中,這時,另外一個事務也訪問這個數據,然后使用了這個數據。因為這個數據是還沒有提交的數據, 那么另
外一個事務讀到的這個數據是臟數據,依據臟數據所做的操作也可能是不正確的。
不可重復讀:在同一事務中,多次讀取同一數據返回的結果有所不同。換句話說就是,后續讀取可以讀到另一事務已提交的
更新數據。相反,“可重復讀”在同一事務中多次讀取數據時,能夠保證所讀數據一樣,也就是,后續讀取不能讀到另一事務
已提交的更新數據。
幻讀:事務T1執行一次查詢,然后事務T2新插入一行記錄,這行記錄恰好可以滿足T1所使用的查詢的條件。然后T1又使用相同
的查詢再次對表進行檢索,但是此時卻看到了事務T2剛才插入的新行。這個新行就稱為“幻像”,因為對T1來說這一行就像突然
出現的一樣。
PROPAGATION(事務傳播屬性)
PROPAGATION_REQUIRED:支持當前事務,如果當前沒有事務,就新建一個事務。也就是說業務方法需要在一個事務中運行,如果
業務方法被調用時,調用業務方法的行為(方法)已經處在一個事務中,那么就加入到該事務,否則為自己創建一個新的事務。
(默認傳播屬性)
PROPAGATION_SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行。也就是說如果業務方法在某個事務范圍內被調用,
則該方法成為該事務的一部分。如果業務方法在事務范圍外被調用,則該方法在沒有事務的環境下執行。
PROPAGATION_MANDATORY:支持當前事務,如果當前沒有事務,就拋出異常。也就是說業務方法只能在一個已經存在的事務中執行,
業務方法不能發起自己的事務。如果業務方法在沒有事務的環境下被調用,容器就會拋出例外。
PROPAGATION_REQUIRESNEW:新建事務,如果當前存在事務,把當前事務掛起。也就是說業務方法被調用時,不管是否已經存在事務,
業務方法總會為自己發起一個新的事務。如果調用業務方法的行為(方法)已經運行在一個事務中,則原有事務會被掛起,新的事務
會被創建,直到業務方法執行結束,新事務才算結束,原先的事務才會恢復執行。
PROPAGATION_NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,就把當前事務掛起。也就是說業務方法不需要事務。如果
方法沒有被關聯到一個事務中,容器不會為它開啟事務。如果方法在一個事務中被調用,該事務會被掛起,在方法調用結束后,
原先的事務便會恢復執行。
PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。也就是說業務方法絕對不能在事務范圍內執行。如果業務
方法在某個事務中執行,容器會拋出例外,只有業務方法沒有關聯到任何事務,才能正常執行。
PROPAGATION_NESTED:如果一個活動的事務存在,則運行在一個嵌套的事務中。 如果沒有活動事務, 則按REQUIRED屬性執行。
它使用了一個單獨的事務, 這個事務擁有多個可以回滾的保存點。內部事務的回滾不會對外部事務造成影響。它只對
DataSourceTransactionManager事務管理器起效。
數據庫事務的4個特性:
原子性(Atomic):組成一個事務的多個數據庫操作是一個不可分割的原子單元;只有所有操作執行成功,整個事務才提交,
其中一個操作失敗,都必須回滾到初始狀態。
一致性(Consistency):事務操作成功后數據庫所處的狀態和它的業務規則是一致的;(即數據總額不會被破壞。
如A賬戶轉賬100到B賬戶,無論操作成功與否,A和B的存款總額是不變的)
隔離性(Isolation):在并發數據操作時,不同的事務擁有各自的數據空間,它們的操作不會對彼此產生干擾。(并非是完全無干擾,
根據數據庫的隔離級別,會產生不同程度的干擾)
持久性(Durability):一旦事務提交成功,事務中的數據操作都必須持久化到數據庫中;就算數據庫崩潰,也必須保證有某種機制恢復。
在這些特性中,數據“一致性”是最終目標,其他的特性都是為了達到這個目標的措施和手段。
- 數據庫
- 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分析和設計(二)
- 數據庫命名規范--通用