TangYuan使用教程-事務

#TangYuan之事務數據庫


1. 事務的定義

Tangyuan中,咱們能夠經過如下配置定義一個事務:併發

<transaction id="tx_01" behavior="required" isolation="default" />

transaction節點屬性說明:ui

屬性名 用途及說明 必填 取值
id 事務定義標識,不可重複 Y 用戶定義
behavior 事務的傳播級別,默認required,可參考Spring事務,默認required N required<br />supports<br />mandatory<br />requires_new<br />not_supported<br />never<br />
never 事務的隔離級別,默認default N default<br />read_uncommitted<br />read_committed<br />repeatable_read<br />serializable<br />

behavior事務傳播屬性說明:設計

取值 用途說明
required 表示當前方法必須在一個具備事務的上下文中運行,若有客戶端有事務在進行,那麼被調用端將在該事務中運行,不然的話從新開啓一個事務。
supports 表示當前方法沒必要須要具備一個事務上下文,可是若是有一個事務的話,它也能夠在這個事務中運行
mandatory 表示當前方法必須在一個事務中運行,若是沒有事務,將拋出異常
requires_new 表示當前方法必須運行在它本身的事務中。一個新的事務將啓動,並且若是有一個現有的事務在運行的話,則這個方法將在運行期被掛起,直到新的事務提交或者回滾才恢復執行。
not_supported 表示該方法不該該在一個事務中運行。若是有一個事務正在運行,他將在運行期被掛起,直到這個事務提交或者回滾才恢復執行
never 表示當方法務不該該在一個事務中運行,若是存在一個事務,則拋出異常

isolation說明:code

取值 用途說明
default 默認設置,同read_uncommitted
read_uncommitted 髒讀<br /> * 髒讀又稱無效數據的讀出,是指在數據庫訪問中,事務T1將某一值修改,而後事務T2讀取該值,此後T1由於某種緣由撤銷對該值的修改,這就致使了T2所讀取到的數據是無效的。<br /> * 髒讀就是指當一個事務正在訪問數據,而且對數據進行了修改,而這種修改尚未提交到數據庫中,這時,另一個事務也訪問這個數據,而後使用了這個數據。 由於這個數據是尚未提交的數據,那麼另一個事務讀到的這個數據是髒數據,依據髒數據所作的操做多是不正確的。
read_committed 不可重複讀<br /> * 不可重複讀,是指在數據庫訪問中,一個事務範圍內兩個相同的查詢卻返回了不一樣數據。<br /> * 這是因爲查詢時系統中其餘事務修改的提交而引發的。好比事務T1讀取某一數據,事務T2讀取並修改了該數據,T1爲了對讀取值進行檢驗而再次讀取該數據,便獲得了不一樣的結果。<br /> * 一種更易理解的說法是:在一個事務內,屢次讀同一個數據。在這個事務尚未結束時,另外一個事務也訪問該同一數據。<br /> * 那麼,在第一個事務的兩次讀數據之間。因爲第二個事務的修改,那麼第一個事務讀到的數據可能不同,這樣就發生了在一個事務內兩次讀到的數據是不同的,所以稱爲不可重複讀,即原始讀取不可重複。
repeatable_read 可重複讀取<br />* 可重複讀(Repeatable Read),當使用可重複讀隔離級別時,在事務執行期間會鎖定該事務以任何方式引用的全部行。 所以,若是在同一個事務中發出同一個SELECT語句兩次或更屢次,那麼產生的結果數據集老是相同的。<br /> * 所以,使用可重複讀隔離級別的事務能夠屢次檢索同一行集,並對它們執行任意操做,直到提交或回滾操做終止該事務。
serializable 同步事務<br /> * 提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接着一個地執行,但不能併發執行。<br /> * 若是僅僅經過「行級鎖」是沒法實現事務序列化的,必須經過其餘機制保證新插入的數據不會被剛執行查詢操做的事務訪問到。

2. 事務的使用

有了上述事務的定義,接下來開始事務的使用。Tangyuan中每一個SQL服務都須要使用事務,或者說每一個SQL服務在執行期間都須要按照指定的事務定義開啓事務,執行SQL命令。咱們能夠經過三種方式設置SQL服務使用的事務定義。事務

1.在SQL服務中,手工設置get

<selectOne id="getUserById" txRef="tx_01" dsKey="ds">
	SELECT * from user WHERE user_id = #{user_id}
</selectOne>

示例中的配置經過txRef屬性手工指定使用tx_01的事務定義同步

2.按照SQL服務ID匹配it

<setDefaultTransaction type="method">
	<property name="select*" 	value="tx_01"/>
	<property name="get*" 		value="tx_01"/>
	<property name="update*" 	value="tx_02"/>
	<property name="insert*" 	value="tx_02"/>
	<property name="delete*" 	value="tx_02"/>
</setDefaultTransaction>

示例中的配置表示按照SQL服務的名稱也就是ID來匹配須要使用的事務定義。好比SQL服務selectUser將使用tx_01事務定義,SQL服務updateUser將使用tx_02事務定義,須要注意的複合SQL將不會根據setDefaultTransaction來匹配事務,須要用戶手工指定。io

3.按照SQL服務類型匹配

<setDefaultTransaction type="command">
	<property name="selectOne" 	value="tx_01"/>
	<property name="selectSet" 	value="tx_01"/>
	<property name="update" 	value="tx_01"/>
	<property name="insert" 	value="tx_01"/>
	<property name="delete" 	value="tx_01"/>
</setDefaultTransaction>

示例中的配置表示按照SQL服務的類型也就是標籤來匹配須要使用的事務定義。好比用<selectOne>標籤訂義SQL服務將使用tx_01事務定義,用<update>標籤訂義的SQL服務將使用tx_02事務定義,須要注意的複合SQL將不會根據setDefaultTransaction來匹配事務,須要用戶手工指定。

3. setDefaultTransaction節點配置

Schema設計圖

schema設計圖

setDefaultTransaction節點屬性說明

屬性名 用途及說明 必填 取值
type 默認事務的匹配模式 Y method:按照SQL服務的名稱匹配<br />command:按照SQL服務的類型匹配

property節點屬性說明

屬性名 用途及說明 必填 取值
name method模式下:SQL服務名稱,支持*表達式<br />command模式下:SQL服務標籤名 Y 用戶定義
value 須要引用的事務定義ID Y 用戶定義
相關文章
相關標籤/搜索