最近在和朋友作一個項目,考慮用springmvc+mybatis來作,以前在公司工做吧,對於數據庫這塊的配置也有人再弄,最近由於這個項目,我就上網學習了一些關於數據庫配置這方面的東西吧,今天給你們分享一下關於spring+mybatis管理事務這方面得知識吧。
先說說spring管理事務的集中方式,我所瞭解的有兩種:第一種是編程式事務管理,第二種是聲明式事務管理,而聲明式事務管理中又有兩種,一種是配置方式,另外一種是聲明式。咱們在工做中通常都使用聲明式事務管理配置,由於這種方式不對代碼的進行侵入。下面我把一段配置貼出來,是我如今要和朋友作的項目的關於數據庫的配置。spring
今天咱們的重點不是這些配置,而是對於事務特性進行一些瞭解:
一、事務的隔離級別
隔離級別是指若干個併發的事務之間的隔離程度。TransactionDefinition 接口中定義了五個表示隔離級別的常量:
TransactionDefinition.ISOLATION_DEFAULT:這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,一般這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務能夠讀取另外一個事務修改但尚未提交的數據。該級別不能防止髒讀,不可重複讀和幻讀,所以不多使用該隔離級別。好比PostgreSQL實際上並無此級別。
TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另外一個事務已經提交的數據。該級別能夠防止髒讀,這也是大多數狀況下的推薦值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程當中能夠屢次重複執行某個查詢,而且每次返回的記錄都相同。該級別能夠防止髒讀和不可重複讀。
TransactionDefinition.ISOLATION_SERIALIZABLE:全部的事務依次逐個執行,這樣事務之間就徹底不可能產生干擾,也就是說,該級別能夠防止髒讀、不可重複讀以及幻讀。可是這將嚴重影響程序的性能。一般狀況下也不會用到該級別。
二、事務的傳播行爲sql
所謂事務的傳播行爲是指,若是在開始當前事務以前,一個事務上下文已經存在,此時有若干選項能夠指定一個事務性方法的執行行爲。數據庫
其實我以爲事務的傳播行爲就是當你在當前事務的方法中去執行另外一個存在事務的方法的一個傳播行爲。apache
PROPAGATION_REQUIRED--支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇。
PROPAGATION_SUPPORTS--支持當前事務,若是當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY--支持當前事務,若是當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW--新建事務,若是當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER--以非事務方式執行,若是當前存在事務,則拋出異常。TransactionDefinition.PROPAGATION_NESTED--若是當前存在事務,則建立一個事務做爲當前事務的嵌套事務來運行;若是當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。編程