spring學習JdbcTemplate數(shù)據(jù)庫事務管理
spring JdbcTemplate數(shù)據(jù)庫事務管理
現(xiàn)在有個賬戶表,里面存著用戶金額。

如果要真正地做好轉賬的操作,就要用到事務,否則當出現(xiàn)異常后會出現(xiàn)數(shù)據(jù)不一致等問題。
try {
// 第一步 開啟事務
// 第二步 進行業(yè)務操作
// 第三步 沒有發(fā)生異常,提交事務
} catch(){
// 第四步 發(fā)生異常,事務回滾
}一、spring 中的事務管理
通常,把事務加在 service 層(業(yè)務邏輯層)。
而在 spring 中管理事務可以有 2 種方式實現(xiàn):
- 編程式管理:就像上面?zhèn)未a那樣,這種使用起來不方便。
- 聲明式管理:通過配置方式實現(xiàn),推薦使用。其中,可以基于 XML 方式進行配置,也可以基于注解,顯然后者更方便。
在 spring 中進行聲明式事務管理,底層使用的是 AOP 原理。
二、spring 事務管理 API
spring 提供了一個接口 PlatformTransactionManager ,代表事務管理器。此接口針對不同的框架提供不同的實現(xiàn)類。
利用idea工具,展開結構,使用 jdbcTemplate 用到的是 DataSourceTransactionManager 。

三、使用事務管理
1. 配置文件
創(chuàng)建事務管理器。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入數(shù)據(jù)源-->
<property name="dataSource" ref="dataSource"></property>
</bean>開啟事務注解,使用名稱空間 tx。
<!--開啟事務注釋-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>2. 類上添加事務注解
注解 @Transactional 可以加在 service 類上,也可以加到方法上:
加到類上,表示類下所有的方法都添加了事務。加到方法,表示只有該方法添加事務。
@Service
@Transactional
public class UserService {
@Autowired
private UserDao userDao;
// 轉賬方法
public void accountMoney() {
// 大周 少 100
userDao.reduceMoney();
// 模擬異常
int i = 1/0;
// 小毛 加 100
userDao.addMoney();
}
}接口實現(xiàn)類 UserDaoImpl 。
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void addMoney() {
String sql = "update t_account set money=money+? where username=?";
jdbcTemplate.update(sql, 100, "小毛");
}
@Override
public void reduceMoney() {
String sql = "update t_account set money=money-? where username=?";
jdbcTemplate.update(sql, 100, "大周");
}
}到測試類里執(zhí)行一下:
public class TestTrans {
@Test
public void testJdbc() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.accountMoney();
}
}注意,上面的 service 里我手動添加了異常,所以執(zhí)行后,事務應該是要回滾操作,2 個人的金額仍然各是 1000 。
八月 07, 2021 10:39:57 上午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
java.lang.ArithmeticException: / by zero刷新數(shù)據(jù)表。

現(xiàn)在我去掉 service 類中的異常 int i = 1/0;,重新執(zhí)行測試方法:
八月 07, 2021 10:47:01 上午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
Process finished with exit code 0刷新數(shù)據(jù)表。

結果正確。
以上就是spring學習JdbcTemplate數(shù)據(jù)庫事務管理的詳細內(nèi)容,更多關于spring JdbcTemplate數(shù)據(jù)庫事務的資料請關注腳本之家其它相關文章!
相關文章
java數(shù)據(jù)結構之實現(xiàn)雙向鏈表的示例
這篇文章主要介紹了java數(shù)據(jù)結構實現(xiàn)雙向鏈表的示例,需要的朋友可以參考下2014-03-03
springcloud本地調(diào)試feign調(diào)用出現(xiàn)的詭異404問題及解決
這篇文章主要介紹了springcloud本地調(diào)試feign調(diào)用出現(xiàn)的詭異404問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
Java Swing GroupLayout分組布局的實現(xiàn)代碼
這篇文章主要介紹了Java Swing GroupLayout分組布局的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
Spring Boot Web 靜態(tài)文件緩存處理的方法
本篇文章主要介紹了Spring Boot Web 靜態(tài)文件緩存處理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02

