這篇文章帶給大家的內容是關於Spring事務管理的相關介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
邏輯上的一組操作,組成操作的每個部分要么全部成功,要么全部失敗
一致性: 交易前後資料完整性保持一致
原子性: 交易不能夠分割,要麼全部成功,要麼全部失敗
#隔離性: 交易的執行不受到其他交易的影響,相互之間隔離
#持久性: 交易一旦完成,那麼就會保存到資料庫中,不受系統崩潰的影響
隔離性引發的問題:
#髒讀:交易讀到其他交易還沒有commit的資料
無法重複讀取:一個交易讀取到其他交易提交的更新update數據,導致多次的查詢結果不一致
幻讀: 一個事務讀到其他事務插入insert的數據,導致多次查詢結果不一致
丟失操作
int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8;
ISOLATION_DEFAULT: 代表spring預設值,表示使用底層資料庫的預設隔離等級。例如mysql 使用ISOLATION_REPEATABLE_READ使用ISOLATION_READ_COMMITTED
ISOLATION_READ_UNCOMMITTED: 未提交讀取,不可以解決讀取問題
ISOLATION_READ_COMMITTED: 已提交讀取,可以解決髒#PATION_READ_COMMITTED: 可以解決讀,不能解決幻讀和不可重複讀
ISOLATION_REPEATABLE_READ: 重複讀取,可以解決髒讀和不可重複讀取
ISOLATION_SERIALIZABLE: 可以解決所有讀取問題,效率不高
PlatformTransactionManager:平台事務管理器
PlatformTransactionManager是一個接口,是Spring底層用來管理事務的物件。
public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
spring事物官網位址
比較常見的實作類別有:
DataSourceTransactionManager:底層使用JDBC事務管理
HibernateTransactionManager:底層使用Hibernate事務管理
TransactionDefinition:
事務定義:可以定義事務的相關訊息,事務傳播行為,隔離級別,超時信息,是否只讀
package org.springframework.transaction; //可以看到事物的定义也是一个接口 public interface TransactionDefinition { //事物的传播行为,7种 int PROPAGATION_REQUIRED = 0; int PROPAGATION_SUPPORTS = 1; int PROPAGATION_MANDATORY = 2; int PROPAGATION_REQUIRES_NEW = 3; int PROPAGATION_NOT_SUPPORTED = 4; int PROPAGATION_NEVER = 5; int PROPAGATION_NESTED = 6; //事物的隔离级别五种 int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8; //事物的超时时间,-1代表没有超时时间 int TIMEOUT_DEFAULT = -1; int getPropagationBehavior(); int getIsolationLevel(); int getTimeout(); boolean isReadOnly(); String getName(); }
TransactionStatus: 事務狀態
事務狀態: 記錄管理事務過程中事務狀態的物件
交易的傳播行為是用來解決業務方法之間相互呼叫的問題
官網傳送閘
前置條件:
方法B()中呼叫方法A()
PROPAGATION_NESTED: A中有事務,A事務正常執行。 A交易執行完成後,設定一個保存點,執行B操作,如果B拋出異常則可回滾到初始位置或回滾到保存點
PROPAGATION_REQUIRED: 如果B方法呼叫A方法,A方法有事務,B方法就會使用A中的交易。如果A中沒有,B就會建立一個交易
PROPAGATION_SUPPORTS: B呼叫A,A中有事務,使用A中的事務,A中沒有事務則B不使用交易
PROPAGATION_MANDATORY: 如果A用有事務,使用A中的事務,A中沒有事務,拋出異常
PROPAGATION_REQUIRES_NEW : A中有事務,把A事務掛起,B開啟事務只包含自身操作。 A中沒有,B建立交易只包含自身操作
PROPAGATION_NOT_SUPPORTED: A中有事務,A掛起,B不使用交易
*PROPAGATION_NEVER: A中有交易B拋出異常
#聲明式事務管理: 在Spring設定檔中宣告式的處理事務來取代程式碼式的處理事務(使用的比較多)
程式設計事務管理:程式碼式的處理事務,需要在程式中編寫程式碼
<!--配置事务管理器--> <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name="dataSource" ref="dataSource" ></property> </bean> <!--配置事务--> <tx:advice id="myAdvice" transaction-manager="trancationManager"> <tx:attributes> <!--配置事务传播和事务隔离--> <tx:method name="save*" propagation="REQUIRED" isolation="REPEATABLE_READ"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="find*" read-only="true"/> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!--事务是利用aop实现的--> <aop:config> <aop:pointcut id="ponitcut" expression="execution(* com.amber.xml.service.AccountServiceImpl.transferMoney(..))"></aop:pointcut> <aop:advisor advice-ref="myAdvice" pointcut-ref="ponitcut" /> </aop:config>
save*表示方法以save開頭的方法,使用PROPATATION_REQUIRED事務傳播,使用REPEATABLE_READ事務隔離
<!--配置事务管理器--> <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name="dataSource" ref="dataSource" ></property> </bean> <!--开启注解事务--> <tx:annotation-driven transaction-manager="trancationManager" />
使用tx:annotation-driven 开启事务的注解后,在使用的时候只需要在类或者方法上加入@Transactional就可以开启注解
文件配置对比
事务基于注解简化了xml中的
使用比较
使用注解必须在类或者方法上添加@Trasactional,如果有多个业务类,则需要在每个业务类上添加
使用xml只需要在配置文件中配置包名即可
以上是Spring事務管理的相關介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!