1. 程式人生 > >spring學習 十八 spring的聲明事物

spring學習 十八 spring的聲明事物

效率 UNC comm 修改 一次 tor 訪問 oca ont

1.編程式事務:
  1.1 由程序員編程事務控制代碼.commit與rollback都需要程序員決定在哪裏調用,例如jdbc中conn.setAutoCimmit(false),conn.commit(),conn.rollback(),以及mybatis中的sqlSession.commit(),sqlSession.rollback()


2.聲明式事務:
  2.1 事務控制代碼已經由 spring 寫好.程序員只需要聲明出哪些方法需要進行事務控制和如何進行事務控制.
3.聲明式事務都是針對於 ServiceImpl 類下方法的
4.事務管理器基於通知(AOP advice)的.

配置方式,簡要描述,spring等一些配置沒有寫全

<!-- 引入數據源配置文件 -->
    <context:property-placeholder location="classpath:db.properties,classpath:second.properties"/>


    <!-- 數據源配置 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName"
value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean> <!--
聲明事物管理器,事物管理器要依賴於數據源 spring事物需要引入spring-jdbc.jar,且需要引入tx約束 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置聲明式事務 ,transaction-manager屬性指定事物管理器--> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <!-- 哪些方法需要有事務控制 --> <!-- 方法以 ins 開頭事務管理 --> <tx:method name="ins*" /> <tx:method name="del*" /> <tx:method name="upd*" /> <tx:method name="*" /> </tx:attributes> </tx:advice> <!-- 聲明式事物是基於AOP的,因此要聲明切點和通知 --> <aop:config> <!-- 切點範圍設置大一些 --> <aop:pointcut expression="execution(*com.bjsxt.service.impl.*.*(..))" id="mypoint" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="mypoint" /> </aop:config>

5.spring聲明式事物的傳播機制

<tx>標簽中的屬性的解釋:

(1) name=”” 哪些方法需要有事務控制,支持*通配符

(2) readonly=”boolean” 是否是只讀事務,如果為 true,告訴數據庫此事務為只讀事務.數據化優化,會對性能有一定提升,所以只要是查詢的方法,建議使用此數據.

如果為 false(默認值),事務需要提交的事務.建議新增,刪除,修改.

(3) propagation屬性, 控制事務傳播行為:

  當一個具有事務控制的方法被另一個有事務控制的方法調用後,需要如何管理事務(新建事務?在事務中執行?把事務掛起?報異常?)

  REQUIRED (默認值): 如果調用方法有事務,調用方法和被調用方法都在這個事物中執行,如果調用方法沒有事務,新建一個事務. 最常用

  MANDATORY:必須在事務內部執行,如果當前有事務,就在事務中執行,如果沒有事務,報錯.

  REQUIRES_NEW:必須在事務中執行,如果當前沒有事務,新建事務,如果當前有事務,把當前事務掛起.

  NOT_SUPPORTED:必須在非事務下執行,如果當前沒有事務,正常執行,如果當前有事務,把當前事務掛起.

  NEVER:必須在非事務狀態下執行,如果當前沒有事務,正常執行,如果當前有事務,報錯.

  NESTED:必須在事務狀態下執行.如果沒有事務,新建事務,如果當前有事務,創建一個嵌套事務.

(4) isolation=”” 事務隔離級別

在多線程或並發訪問下如何保證訪問到的數據具有完整性的.
臟讀:

  一個事務(A)讀取到另一個事務(B)中未提交的數據,另一個事務中數據可能進行了改變,此時A事務讀取的數據可能和數據庫中數據是不一致的,此時認為數據是臟數據,讀取臟數據過程叫做臟讀.



不可重復讀:

  主要針對的是某行數據.(或行中某列),主要針對的操作是修改操作.兩次讀取在同一個事務內當事務A第一次讀取事務後,事務B對事務A讀取的淑君

進行修改,事務 A 中再次讀取的數據和之前讀取的數據不一致,過程不可重復讀.


幻讀:
主要針對的操作是新增或刪除兩次事務的結果. 事務A按照特定條件查詢出結果,事務B新增了一條符合條件的數據.事務 A 中查詢的數據和數據庫中的數據不一致的,事務 A 好像出現了幻覺,這種情況稱為幻讀.


isolation的值可以有一下幾種,就是隔離級別

DEFAULT: 默認值,由底層數據庫自動判斷應該使用什麽隔離界別

READ_UNCOMMITTED: 可以讀取未提交數據,可能出現臟讀,不重復讀,幻讀. 效率最高.


READ_COMMITTED:只能讀取其他事務已提交數據.可以防止臟讀,可能出現不可重復讀和幻讀.

REPEATABLE_READ: 讀取的數據被添加鎖,防止其他事務修改此數據,可以防止不可重復讀.臟讀,可能出現幻讀.

SERIALIZABLE: 排隊操作,對整個表添加鎖.一個事務在操作數據時,另一個事務等待事務操作完成後才能操作這個表.,最安全的,效率最低的.

(5) rollback-for屬性,值為異常類型全限定路徑

當出現什麽異常時需要進行回滾,建議:給定該屬性值.,手動拋異常一定要給該屬性值.

(6)no-rollback-for=””

當出現什麽異常時不滾回事務.

spring學習 十八 spring的聲明事物