標籤:順序 blank poi ring 必須 轉變 viso 作者 哪些
說到事務,無非就是事務的提交commit和復原rollback。
事務是一個操作序列,這些操作要麼全部都執行成功,事務去提交,要麼就是有一個操作失敗,事務去復原。
要知道事務的4大特性ACID.即原子,一致,隔離,持久。
原子性(atomicity):一個事務是一個不可分割的工作單位,事務中的諸多操作,要麼都做,要麼都不做。
一致性(consistency):事務必須使資料庫從一個一致性狀態,轉變為另一個一致性狀態。一致性和原子性是密切相關的。
隔離性:(isolation)一個事務的執行不能被其他事務幹擾,即一個事務內部的操作及使用的資料對並發的其他事務是隔離的,並發執行的各個事務不能互相干擾。
持久性(durability):持久性也稱永久性,指一個事務一旦提交,他對資料庫中的資料的改變就應該是永久性的。接下來的其他動作或故障不應該對齊有任何影響。
手動設定事務
try{
開啟事務
操作1--》db操作
操作2--》db操作
操作3--》db操作
提交事務
}catch{
復原事務
}
下面用ssm架構來管理事務
1首先配置交易管理員
關鍵類是DataSourceTransactionManager。
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>(表示管理哪個資料來源的事務)
</bean>
2聲明事務的特性、規則(註解方式不用配置事務特性)
<!--通過<tx:advice>標籤定義事務增強,並制定交易管理員 -->
<tx:advice id="txAdvice" transaction-manager="txManager">(聲明哪個交易管理員的事務特性)
<!--定義屬性,聲明事務規則 -->
<tx:attributes>
<tx:method name="create*" propagation="REQUIRED" isolation="DEFAULT" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
分析下事務的propagation傳播方式
53041564/
分析下事務的isolation
隔離性
對相同的資料進行讀寫時,事務並發會發生錯誤資料處理,會產生髒讀、幻讀,不可重複讀取等錯誤,這些可以通過設定事務的隔離等級來解決
髒讀:一個事務讀取了另一個事務改寫但還未提交的資料,如果這些資料被復原,則讀到的資料時無效的
不可重複讀取:在同一事務中,多次讀取同一資料返回的結果不同,換句話說,後續讀取可以讀到另一事務已提交的更新資料,這樣就會出現兩次讀取資料不一樣(如事務t1讀取某一資料,事務t2讀取並修改了該資料,t1為了讀取值驚醒校正而在此讀取改資料,得到了不同的結果)
可重複讀:在同一事務中多次讀取資料時,能夠保證所讀資料一樣,也就是後續讀取不能讀到另一事務已經提交更新的資料
幻讀:一個事務讀取了幾行記錄後,另一事務插入一些記錄,幻讀就發生了,再後來的查詢中,第一個事務就會發現原來沒有的記錄
隔離等級(isolation):
1、讀未提交 READ_UNCOMMITTED 還未提交就能查看
2、讀已提交 READ_COMMITTED 這個層級會把查看,增刪改隔離開來,未提交的增刪改不能查看
3、可重複讀REPEATABLE_READ
4、序列化操作SERIALIZABLE 事務間對同一資料互斥,必須等第一個事物完成之後,第二個事務才可以操作
預設值 DEFAULT(oracle 預設值是第二個,mysql是第三個)
隔離等級由低到高的順序 READ_UNCOMMITTED -->READ_COMMITTED-->REPEATABLE_READ-->SERIALIZABLE層級越高安全性越高,並發處理能力越低
itachi
連結:https://www.jianshu.com/p/702ea7a02a10
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。
分析下事務的rollback-for
是交易回復方式一般異常時復原Exception
3配置事務
3.1使用註解來配置
<!-- 開啟事務註解,標註@Transactional的類和方法將具有事務性 -->
<tx:annotation-driven transaction-manager="txManager" />(使用哪個交易管理員來配置事務)
註解的用法,必須為public方法才行,不要捕捉異常,要讓異常自動拋出,否則不能進行交易回復。方法要寫在服務層中在controller中無效。
@Transactional(isolation=isolation.READ_COMMITED)
public void f3(){
處理1
處理2
}
3.2使用標籤來配置(註解方式不用配置事務特性)
<!-- 在切面中插入事務 -->
<aop:config proxy-target-class="true">
(
事務代理(代理歸屬權)
建立的sqlsesstion用什麼接收的問題?
proxy-target-class=false
jdk的代理(只能用impl,不能用介面)
proxy-target-class=true
spring的代理(可以用介面了)
)
<aop:pointcut id="serviceMethod" expression="execution(* com.lyt.soa.service..*.*(..))"/>(在哪些切點中加入事務)
<!-- 將事務增強與切入點組合(織入事務切面) -->
<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>(織入事務並規定了事務特性)
</aop:config>
java交易處理