目錄
一、事務(wù)管理方案
1. 修改業(yè)務(wù)層代碼
2. 測(cè)試
二、事務(wù)管理器
1. 簡(jiǎn)介
2. 在配置文件中引入約束
3. 進(jìn)行事務(wù)配置
三、事務(wù)控制的API
1.?PlatformTransactionManager接口
2.?TransactionDefinition接口
3.?TransactionStatus接口
往期專欄&文章相關(guān)導(dǎo)讀?
1. Maven系列專欄文章
2. Mybatis系列專欄文章
3. Spring系列專欄文章?
?
一、事務(wù)管理方案
????????聲明式事務(wù)底層采用AOP技術(shù),在service層手動(dòng)添加事務(wù)就可以解決上一篇提到的問題。
1. 修改業(yè)務(wù)層代碼
????????添加一個(gè)SqlSessionTemplate對(duì)象,讓我們對(duì)業(yè)務(wù)方法進(jìn)行try catch,沒有異常則進(jìn)行提交,捕捉到異?;貪L即可。
package com.example.service;
import com.example.dao.AccountDao;
import com.example.pojo.Account;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AccountService {
@Autowired
private AccountDao accountDao;
@Autowired
private SqlSessionTemplate sessionTemplate;
/**
*
* @param id1 轉(zhuǎn)出人id
* @param id2 轉(zhuǎn)入人id
* @param price 金額
*/
// 作用方法上時(shí),該方法都將具有該類型事務(wù)的事務(wù)屬性
public void transfer(int id1,int id2, double price){
try {
// 轉(zhuǎn)出人減少余額
Account account1 = accountDao.findById(id1);
account1.setBalance(account1.getBalance() - price);
accountDao.update(account1);
// 模擬程序出錯(cuò)
int i = 1 / 0;
// 轉(zhuǎn)入人增加余額
Account account2 = accountDao.findById(id2);
account2.setBalance(account2.getBalance() + price);
accountDao.update(account2);
sessionTemplate.commit();
}
catch (Exception e){
e.printStackTrace();
sessionTemplate.rollback();
}
}
}
2. 測(cè)試
?OK,可以看到這里程序是出現(xiàn)異常中斷了的。?現(xiàn)在觀看數(shù)據(jù)庫(kù)里面的情況是怎么樣的。?
????????OK,可以看到這里張三確實(shí)沒有被扣錢啊,所以手動(dòng)提交事務(wù)也是可以的,但是這樣我們的try catch就太多了。因此有了事務(wù)管理器。
二、事務(wù)管理器
1. 簡(jiǎn)介
????????Spring依賴事務(wù)管理器進(jìn)行事務(wù)管理,事務(wù)管理器即一個(gè)通知類,我們?yōu)樵撏ㄖ愒O(shè)置切點(diǎn)為service層方法即可完成事務(wù)自動(dòng)管理。由于不同技術(shù)操作數(shù)據(jù)庫(kù),進(jìn)行事務(wù)操作的方法不同。如:JDBC提交事務(wù)是 connection.commit() ,MyBatis提交事務(wù)是 sqlSession.commit() ,所以Spring提供了多個(gè)事務(wù)管理器。
事務(wù)管理器名稱 | 作用 |
org.springframework.jdbc.datasource.DataSourceTransactionManager | 針對(duì)JDBC技術(shù)提供的事務(wù)管理器。適用于JDBC和MyBatis。 |
org.springframework.orm.hibernate3.HibernateTransactionManager | 針對(duì)于Hibernate框架提供的事務(wù)管理器。適用于Hibernate框架。 |
org.springframework.orm.jpa.JpaTransactionManager | 針對(duì)于JPA技術(shù)提供的事務(wù)管理器。適用于JPA技術(shù)。 |
org.springframework.transaction.jta.JtaTransactionManager | 跨越了多個(gè)事務(wù)管理源。適用在兩個(gè)或者是多個(gè)不同的數(shù)據(jù)源中實(shí)現(xiàn)事務(wù)控制。 |
????????我們使用MyBatis操作數(shù)據(jù)庫(kù),接下來使用 DataSourceTransactionManager 進(jìn)行事務(wù)管理。
2. 在配置文件中引入約束
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
3. 進(jìn)行事務(wù)配置
在applicationContext.xml文件新增配置
<!-- 事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 進(jìn)行事務(wù)相關(guān)配置 -->
<tx:advice id = "txAdvice">
<tx:attributes>
<!-- 代表所有方法 -->
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切點(diǎn) -->
<aop:pointcut id="pointcut" expression="execution(* com.example.service..*(..))"/>
<!-- 配置通知 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>
三、事務(wù)控制的API
? ? ? ? 事務(wù)管理器都實(shí)現(xiàn)了PlatformTransactionManager接口,Spring進(jìn)行事務(wù)控制的功能是由三個(gè)接口提供的,這三個(gè)接口是Spring實(shí)現(xiàn)的,在開發(fā)中我們很少使用到,只需要了解他們的作用即可:
1.?PlatformTransactionManager接口
PlatformTransactionManager是Spring提供的事務(wù)管理器接口,所有事務(wù)管理器都實(shí)現(xiàn)了該接口。該接口中提供了三個(gè)事務(wù)操作方法:
- TransactionStatus getTransaction(TransactionDefinition definition):獲取事務(wù)狀態(tài)信息。
- void commit(TransactionStatus status):事務(wù)提交
- void rollback(TransactionStatus status):事務(wù)回滾
2.?TransactionDefinition接口
TransactionDefinition是事務(wù)的定義信息對(duì)象,它有如下方法:
- String getName():獲取事務(wù)對(duì)象名稱。
- int getIsolationLevel():獲取事務(wù)的隔離級(jí)別。
- int getPropagationBehavior():獲取事務(wù)的傳播行為。
- int getTimeout():獲取事務(wù)的超時(shí)時(shí)間。
- boolean isReadOnly():獲取事務(wù)是否只讀。
3.?TransactionStatus接口
TransactionStatus是事務(wù)的狀態(tài)接口,它描述了某一時(shí)間點(diǎn)上事務(wù)的狀態(tài)信息。它有如下方法:文章來源:http://www.zghlxwxcb.cn/news/detail-478693.html
- void flush() ?刷新事務(wù)
- boolean hasSavepoint() 獲取是否存在保存點(diǎn)
- boolean isCompleted() 獲取事務(wù)是否完成
- boolean isNewTransaction() 獲取是否是新事務(wù)
- boolean isRollbackOnly() 獲取是否回滾
- void setRollbackOnly() ?設(shè)置事務(wù)回滾
往期專欄&文章相關(guān)導(dǎo)讀?
?????大家如果對(duì)于本期內(nèi)容有什么不了解的話也可以去看看往期的內(nèi)容,下面列出了博主往期精心制作的Maven,Mybatis等專欄系列文章,走過路過不要錯(cuò)過哎!如果對(duì)您有所幫助的話就點(diǎn)點(diǎn)贊,收藏一下啪。其中Spring專欄有些正在更,所以無法查看,但是當(dāng)博主全部更完之后就可以看啦。文章來源地址http://www.zghlxwxcb.cn/news/detail-478693.html
1. Maven系列專欄文章
Maven系列專欄 | Maven工程開發(fā) |
Maven聚合開發(fā)【實(shí)例詳解---5555字】 |
2. Mybatis系列專欄文章
Mybatis系列專欄 | MyBatis入門配置 |
Mybatis入門案例【超詳細(xì)】 | |
MyBatis配置文件 —— 相關(guān)標(biāo)簽詳解 | |
Mybatis模糊查詢——三種定義參數(shù)方法和聚合查詢、主鍵回填 | |
Mybatis動(dòng)態(tài)SQL查詢 --(附實(shí)戰(zhàn)案例--8888個(gè)字--88質(zhì)量分) | |
Mybatis分頁(yè)查詢——四種傳參方式 | |
Mybatis一級(jí)緩存和二級(jí)緩存(帶測(cè)試方法) | |
Mybatis分解式查詢 | |
Mybatis關(guān)聯(lián)查詢【附實(shí)戰(zhàn)案例】 | |
MyBatis注解開發(fā)---實(shí)現(xiàn)增刪查改和動(dòng)態(tài)SQL | |
MyBatis注解開發(fā)---實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢 |
3. Spring系列專欄文章?
Spring系列專欄 | Spring IOC 入門簡(jiǎn)介【自定義容器實(shí)例】 |
IOC使用Spring實(shí)現(xiàn)附實(shí)例詳解 | |
Spring IOC之對(duì)象的創(chuàng)建方式、策略及銷毀時(shí)機(jī)和生命周期且獲取方式 | |
Spring DI簡(jiǎn)介及依賴注入方式和依賴注入類型 | |
Spring IOC相關(guān)注解運(yùn)用——上篇 | |
Spring IOC相關(guān)注解運(yùn)用——下篇 | |
Spring AOP簡(jiǎn)介及相關(guān)案例 | |
注解、原生Spring、SchemaBased三種方式實(shí)現(xiàn)AOP【附詳細(xì)案例】 | |
Spring事務(wù)簡(jiǎn)介及相關(guān)案例 | |
Spring 事務(wù)管理方案和事務(wù)管理器及事務(wù)控制的API | |
Spring 事務(wù)的相關(guān)配置、傳播行為、隔離級(jí)別及注解配置聲明式事務(wù) |
到了這里,關(guān)于Spring 事務(wù)管理方案和事務(wù)管理器及事務(wù)控制的API的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!