Srping 事務管理 spring
一 事務管理的一.事務的4個特性:
原子性:一個事務中全部對數據庫的操做是一個不可分割的操做序列,要麼全作,要麼所有作。
一致性:數據不會由於事務的執行而遭到破壞。
隔離性:一個事務的執行,不受其餘事務(進程)的干擾。既併發執行的個事務之間互不干擾。
持久性:一個事務一旦提交,它對數據庫的改變將是永久的。
二.事務的實現方式:
實現方式共有兩種:編碼方式;聲明式事務管理方式。
基於AOP技術實現的聲明式事務管理,實質就是:在方法執行先後進行攔截,而後在目標方法開始以前建立並加入事務,執行完目標方法後根據執行狀況提交或回滾事務。
聲明式事務管理又有兩種方式:基於XML配置文件的方式;另外一個是在業務方法上進行@Transactional註解,將事務規則應用到業務邏輯中。
三.建立事務的時機:
是否須要建立事務,是由事務傳播行爲控制的。讀數據不須要或只爲其指定只讀事務,而數據的插入,修改,刪除就須要事務管理了。 數據庫
一種常見的事務管理配置:事務攔截器TransactionInterceptor和事務自動代理BeanNameAutoProxyCreator相結合的方式
<!--定義Hibernate的事務管理器HibernateTransactionManager -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 依賴注入上面定義的sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--定義Spring的事務攔截器TransactionInterceptor -->
<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!-- 依賴注入上面定義的事務管理器transactionManager -->
<property name="transactionManager" ref="transactionManager"/>
<!-- 定義須要進行事務攔截的方法及所採用的事務控制類型 -->
<property name="transactionAttributes">
<props>
<!-- 以browse、list、load、get及is開頭的全部方法採用只讀型事務控制類型 -->
<prop key="browse*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="list*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
<!-- 全部方法均進行事務控制,若是當前沒有事務,則新建一個事務 -->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 定義BeanNameAutoProxyCreatorf進行Spring的事務處理-->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 針對指定的bean自動生成業務代理 -->
<property name="beanNames">
<list>
<value>adminService</value>
<value>columnsService</value>
<value>newsService</value>
<value>crawlService</value>
<value>memberLevelService</value>
<value>memberService</value>
<value>categoryService</value>
<value>merService</value>
<value>cartService</value>
<value>ordersService</value>
<value>trafficService</value>
</list>
</property>
<!-- 這個屬性爲true時,表示被代理的是目標類自己而不是目標類的接口 -->
<property name="proxyTargetClass">
<value>true</value>
</property>
<!-- 依賴注入上面定義的事務攔截器transactionInterceptor -->
<property name="interceptorNames">
<list>
<value>transactionInterceptor</value>
</list>
</property>
</bean> session
事務管理器有一下幾種: 併發
JDBC DataSource事務管理器
org.springframework.jdbc.datasource.DataSourceTransactionManager
Hibernate的事務管理器:
org.springframework.orm.hibernate.HibernateTransactionManager
JDO的事務管理器:
org.springframework.orm.jdo.JdoTransactionManager
JTA事務管理器:
org.springframework.transaction.jta.JtaTransactionManager
OJB事務管理器:
org.springframework.orm.ojb.PersistenceBrokerTransactionManager 編碼