Spring声明式事务管理(基于注解方式实现)

Posted siwuxie095

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring声明式事务管理(基于注解方式实现)相关的知识,希望对你有一定的参考价值。

----------------------siwuxie095

   

   

   

   

   

   

   

   

Spring 声明式事务管理(基于注解方式实现)

   

   

以转账为例

   

   

1、导入相关 jar 包(共 10 个包)

   

1)导入核心 jar 包和日志相关的 jar 包

   

   

   

   

2)导入 JdbcTemplate 的 jar 包

   

   

   

   

3)导入 mysql 的 JDBC 驱动包

   

   

   

mysql-connector-java 下载链接:

   

https://dev.mysql.com/downloads/connector/j/

   

   

   

4)导入 AOP 的 jar 包

   

   

   

   

   

2、在 MySQL 中手动创建数据库和表

   

数据库名:tx_db,表名:account,字段:id、name、money

   

   

   

手动添加数据,用作测试

   

   

   

   

   

3、具体步骤

   

1)配置事务管理器

   

<!-- 配置事务管理器 -->

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<!--

DataSourceTransactionManager 源代码中有

属性 dataSource 和其 set 方法,所以可以注入

-->

<property name="dataSource" ref="dataSource"/>

</bean>

   

   

   

2)配置事务注解

   

<!-- 配置事务注解,即 开启事务注解 -->

<tx:annotation-driven transaction-manager="transactionManager"/>

   

   

   

3)在使用事务的类上添加注解:@Transactional

   

「使用事务的类一般在业务层

   

   

   

   

4、具体实现

   

   

编写一个 Dao 类

   

AccountDao.java:

   

package com.siwuxie095.dao;

   

import org.springframework.jdbc.core.JdbcTemplate;

   

public class AccountDao {

   

private JdbcTemplate jdbcTemplate;

 

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {

this.jdbcTemplate = jdbcTemplate;

}

 

 

/**

* 转出

*/

public void lessMoney(String from, int money) {

String sql="update account set money=money-? where name=?";

jdbcTemplate.update(sql, money, from);

}

 

 

/**

* 转入

*/

public void moreMoney(String to, int money) {

String sql="update account set money=money+? where name=?";

jdbcTemplate.update(sql, money, to);

}

 

}

   

   

   

2)编写一个 Service 类

   

AccountService.java:

   

package com.siwuxie095.service;

   

import org.springframework.transaction.annotation.Transactional;

   

import com.siwuxie095.dao.AccountDao;

   

// 在使用事务的类上添加注解:@Transactional

@Transactional

public class AccountService {

   

private AccountDao accountDao;

 

public void setAccountDao(AccountDao accountDao) {

this.accountDao = accountDao;

}

 

 

/**

* 转账

*/

public void transfer(String from,String to,int money) {

 

accountDao.lessMoney(from, money);

 

// 即便中间出现了什么异常,也会进行回滚

// 如:int num=10/0;

 

accountDao.moreMoney(to, money);

 

}

 

}

   

   

   

3)在配置文件中进行配置

   

applicationContext.xml:

   

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx.xsd">

 

 

<!-- 配置内置连接池 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="com.mysql.jdbc.Driver"/>

<!--

jdbc:mysql:///tx_db jdbc:mysql://localhost:3306/tx_db 的简写

-->

<property name="url" value="jdbc:mysql:///tx_db"/>

<property name="username" value="root"/>

<property name="password" value="8888"/>

</bean>

 

 

 

<!-- 配置事务管理器 -->

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<!--

DataSourceTransactionManager 源代码中有

属性 dataSource 和其 set 方法,所以可以注入

-->

<property name="dataSource" ref="dataSource"/>

</bean>

 

 

<!-- 配置事务注解,即 开启事务注解 -->

<tx:annotation-driven transaction-manager="transactionManager"/>

 

 

 

<!-- 配置对象并注入属性 -->

<bean id="accountService" class="com.siwuxie095.service.AccountService">

<property name="accountDao" ref="accountDao"></property>

</bean>

 

<bean id="accountDao" class="com.siwuxie095.dao.AccountDao">

<property name="jdbcTemplate" ref="jdbcTemplate"></property>

</bean>

 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<!--

JdbcTemplate 源代码中有属性 dataSource

和其 set 方法,所以可以注入

-->

<property name="dataSource" ref="dataSource"></property>

</bean>

   

   

</beans>

   

   

   

4)编写一个测试类

   

TestDemo.java:

   

package com.siwuxie095.test;

   

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

   

import com.siwuxie095.service.AccountService;

   

public class TestDmo {

   

/**

* 手动加上 @Test 以进行单元测试(将自动导入 JUnit 4 jar 包)

*

* 选中方法名,右键->Run As->JUint Test

*/

@Test

public void testService() {

 

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

 

AccountService accountService=(AccountService) context.getBean("accountService");

 

accountService.transfer("小白", "小黑", 1000);

}

 

}

   

   

   

   

   

   

   

   

   

   

   

【made by siwuxie095】

以上是关于Spring声明式事务管理(基于注解方式实现)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 中使用 @Transactional 注解配置事务管理

Spring Boot 中使用 @Transactional 注解配置事务管理

Spring Boot 中使用 @Transactional 注解配置事务管理

阶段3 2.Spring_10.Spring中事务控制_7 spring基于注解的声明式事务控制

Spring_8-Spring事务管理

Spring 事务控制 -- 基于注解的声明式事务控制