事務的基本原理:spring
Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是沒法提供事務功能的。對於純JDBC操做數據庫,想要用到事務,能夠按照如下步驟進行:數據庫
數據庫隔離級別併發
隔離級別 | 隔離級別的值 | 致使的問題 |
Read-Uncommitted | 0 | 致使髒讀 |
Read-Committed | 1 | 避免髒讀,容許不可重複讀和幻讀 |
Repeatable-Read | 2 | 避免髒讀,不可重複讀,容許幻讀 |
Serializable | 3 | 串行化讀,事務只能一個一個執行,避免了髒讀、不可重複讀、幻讀。執行效率慢,使用時慎重 |
髒讀:一事務對數據進行了增刪改,但未提交,另外一事務能夠讀取到未提交的數據。若是第一個事務這時候回滾了,那麼第二個事務就讀到了髒數據。性能
不可重複讀:一個事務中發生了兩次讀操做,第一次讀操做和第二次操做之間,另一個事務對數據進行了修改,這時候兩次讀取的數據是不一致的。spa
幻讀:第一個事務對必定範圍的數據進行批量修改,第二個事務在這個範圍增長一條數據,這時候第一個事務就會丟失對新增數據的修改。接口
總結:事務
隔離級別越高,越能保證數據的完整性和一致性,可是對併發性能的影響也越大。ci
大多數的數據庫默認隔離級別爲 Read Commited,好比 SqlServer、Oracle開發
少數數據庫默認隔離級別爲:Repeatable Read 好比: MySQL InnoDBget
對於項目中須要使用到事務的地方,我建議開發者仍是使用spring的TransactionCallback接口來實現事務,不要盲目使用spring 事務註解,若是必定要使用註解,那麼必定要對spring事務的傳播機制和隔離級別有個詳細的瞭解,不然極可能發生意想不到的效果。