spring的事務處理
-
什么是事務
在mysql中,提出了事務,事務是指一組sql陳述句的集合,集合中有多條sql陳述句 可能是insert,update,select,delete,我們希望這些多個sql陳述句都能成功, 或者都失敗,這些sql陳述句的執行是一致的,作為一個整體執行, -
在什么時候想到使用事務
當我的操作涉及到多個表,或者多個sql陳述句的insert,update,delete,需要保證 這些陳述句都是成功才能完成我的功能,或者都失敗,保證操作是符合要求的, 在java代碼中寫程式,控制事務,此時事務應該放在哪里? service類的業務方法上,因為業務方法會呼叫多個dao方法,執行多個sql陳述句 -
通常使用jdbc訪問資料庫,還有mybatis訪問資料庫怎么處理事務
jdbc訪問資料,處理事務 Conncotion conn; conn.commit(); conn.rollback(); mybatis訪問資料庫,處理事務, SqlSession.commit(); SqlSession.rollback(); -
3中事務的處理方式有什么不足
- 不同的資料庫訪問技術,處理事務的物件,方法不同,
需要了解不同資料庫訪問技術使用事務的原理 - 掌握多種資料庫中事務的處理邏輯,什么時候提交事務,什么時候回滾事務
- 處理事務的多種方法,
總結:就是多種資料庫的訪問技術,有不同的事務處理機制,物件,方法
- 不同的資料庫訪問技術,處理事務的物件,方法不同,
-
怎么解決不足
spring提供了一種事務處理模型,能使用統一的步驟(方式),完成多種不同的資料庫訪問技術的事務處理, 使用spring的事務處理機制,可以完成mybatis訪問資料庫的事務處理, 使用spring的事務處理機制,可以完成hibernate訪問資料庫的事務處理, -
處理事務,需要怎么做,做什么
spring處理事務的模型,使用的步驟是固定的,把事務的使用資訊提供給spring就可以了-
事務內部提交,回滾事務,使用的事務管理器物件,代替完成commit,rollback
事務管理器是一個介面和它的眾多實作類,
介面:PlatformTransactionManager,定義了事務重要方法 commit,rollback
實作類:spring把每一種資料庫訪問技術對應的事務處理器都創建好了,
mybatis訪問資料庫------spring創建好的是DataSourceTransactionManager
hibernate訪問資料庫-----spring創建好的是HibernateTransactionManager怎么使用:需要告訴spring,使用的是哪種資料庫訪問技術,
宣告資料庫訪問技術對應的是實作類,在spring的組態檔中使用宣告就可以了例如:要使用mybatis訪問資料庫,應該在xml組態檔中
<bean id="xxx" class="...DataSourceTransactionManager" /> -
業務方法需要什么樣的事務,宣告需要事務的型別,
宣告方法需要的事務:-
事務的隔離級別:有4(+1個默認)個值
- READ_UNCOMMITTED:讀未提交,為解決任何并發問題,
- READ_COMMITTED:讀未提交,解決臟讀,存在不可重復讀與幻讀,
- REPEATABLE_READ:可重復讀,解決臟讀,不可重復讀,存在幻讀,
- SERIALIZABLE:串行化,不存在并發問題,
-
事務的超時時間:表示一個方法最長的執行時間,如果方法執行時超過了時間,事務就回滾,
單位是秒,整數值,默認是-1.(一般不設定,默認) -
事務的傳播行為:控制業務方法是不是有事務,是什么樣的事務,
7個傳播行為,表示你的業務方法呼叫時,事務在方法之間時如何使用的, **PROPAGATION_REQUIRED** **PROPAGATION_REQUIRES_NEW** **PROPAGATION_SUPPORTS** 以上三個需要掌握 PROPAGATION_MANDATORY PROPAGATION_NESTED PROPAGATION_NEVER PROPAGATION_NOT_SUPPORTED
-
-
事務提交事務,回滾事務的時機
- 當你的業務方法,執行成功,沒有例外拋出,當方法執行完畢,spring在方法執行后提交事務,
- 當你的業務方法拋出運行時例外或error,spring執行回滾,呼叫事務管理器的rollback,
運行時例外的定義:RuntimeException和它的子類都是運行時例外 - 當業務方法拋出非運行時例外,主要是受檢例外時,提交事務,
受檢例外:在寫代碼時必須處理的例外,
-
總結spring的事務:
-
管理事務的是 事務管理器和它的實作類
-
spring的事務是一個統一模型
- 指定要使用的事務管理器的實作類,使用
- 指定哪些類,哪些方法需要加入事務的功能
- 指定方法需要的隔離級別,傳播行為,超時
你需要告訴spring,你的專案中類資訊,方法的名稱,方法的事務傳播行為,
spring框架中提供的事務處理方案
-
適合中小專案,注解方案,
spring框架自己呼叫aop實作給業務方法增加事務的功能,使用@Transactional注解增加事務,
@Transactional注解是spring框架自己的注解,放在public方法的上面,表示當前方法具有事務,
可以給注解的屬性賦值,表示具體的隔離級別,傳播行為,例外資訊等等
使用@Transactional注解的步驟:- 需要上面事務管理器物件
<bean id="xx" class="DataSourceTransactionManager"></bean> - 開啟事務注解驅動,告訴spring框架,我要使用注解的方式管理事務,
spring使用aop機制,創建@Transactional注解所在的類代理物件,給物件加入事務的功能,
spring給業務方法加入事務:
在你的業務方法執行之前,先開啟事務,在業務方法之后提交或回滾事務,使用aop的環繞通知, - 在方法上加入@Transactional注解
- 需要上面事務管理器物件
-
適合大型專案,有很多的類,方法,需要大量的配置事務,使用aspectJ框架功能,在spring組態檔中
宣告類,方法需要的事務,這種方式,業務方法和事務配置完全分離
實作步驟:都是在xml組態檔中實作
- 要使用aspectJ框架,需要加入依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
- 宣告事務管理器物件
<bean id="xx" class="DataSourceTransactionManager">
- 宣告方法需要的事務型別(配置方法的事務屬性[隔離級別,傳播行為,超時])
- 配置aop:指定哪些類需要創建代理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/229284.html
標籤:其他
