【Spring】声明式事务管理

步骤:

引入jar包

spring-core相关jar包

spring-jdbc相关jar包

spring-aop相关jar包


xml方式实现声明式事务管理

先创建一个Dept类

package cn.qblank.a_tx;

public class Dept {
	private int deptId;
	private String deptName;
	public int getDeptId() {
		return deptId;
	}
	public void setDeptId(int deptId) {
		this.deptId = deptId;
	}
	public String getDeptName() {
		return deptName;
	}
	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}
}

然后写好对应的DeptDao类

package cn.qblank.a_tx;

import org.springframework.jdbc.core.JdbcTemplate;

public class DeptDao {
	//容器注入jdbcTemplate对象
	private JdbcTemplate jdbcTemplate;
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	public void save(Dept dept){
		String sql = "insert into dept(deptName) value(?) ";
		jdbcTemplate.update(sql,dept.getDeptName());
	}
}

DeptService类

package cn.qblank.a_tx;

public class DeptService {
	//注入IOC容器
	private DeptDao deptDao;
	public void setDeptDao(DeptDao deptDao) {
		this.deptDao = deptDao;
	}
	public void save(Dept dept){
		deptDao.save(dept);
		//发生异常,全部回滚
		int i = 1/0;
	}
}




写好jdbc的连接配置db.properties放在src目录下:

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///day09
jdbc.initPoolSize=5
jdbc.maxPoolSize=10
jdbc.maxStatements=100
jdbc.acquireIncrement=2

接下来就是关键的一部,使用spring配置连接配置信息,注入相关实例,并进行声明事务管理配置

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	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/context
         http://www.springframework.org/schema/context/spring-context.xsd
         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">
    
    <!-- 1.加载配置文件db.properties -->
    <context:property-placeholder location="classpath:db.properties"/>
	<!-- 2.数据源配置 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name= "initialPoolSize" value="${jdbc.initPoolSize}"></property>
		<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
		<property name="maxStatements" value="${jdbc.maxStatements}"></property>
		<property name="acquireIncrement" value="${jdbc.acquireIncrement}"></property>
	</bean>
	<!-- 3.jdbcTemplate实例 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 4.DeptDao实例 -->
	<bean id="deptDao" class="cn.qblank.a_tx.DeptDao">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>
	<!-- 5.DeptService实例 -->
	<bean id="deptService" class="cn.qblank.a_tx.DeptService">
		<property name="deptDao" ref="deptDao"></property>
	</bean>
	<!-- #############6. Spring声明式事务管理配置############### -->
	<!-- 6.1配置事务管理类 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 6.2配置事务增强 -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<!-- 拦截的方法名  是否为只读 -->
			<tx:method name="get*" read-only="true"/>
			<tx:method name="find*" read-only="true"/>
			<tx:method name="*" read-only="false"/>
		</tx:attributes>
	</tx:advice>
	
	<!-- AOP配置 -->
	<aop:config>
		<!-- 拦截该包下所有方法 -->
		<aop:pointcut expression="execution(* cn.qblank.a_tx.DeptService.save(..))" id="pt"/>
		<!-- 引入事务增强  引入切入点表达式 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
	</aop:config>	
</beans>

最后我们再对其进行测试

package cn.qblank.a_tx;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
	public static void main(String[] args) {
		ApplicationContext ac = new ClassPathXmlApplicationContext("cn/qblank/a_tx/bean.xml");
		Dept dept = new Dept();
		dept.setDeptName("软件测试部");
		DeptService deptService = (DeptService) ac.getBean("deptService");
		deptService.save(dept);
		
		System.out.println("添加成功");
		ac = null;
	}
}

运行结果:


数据库信息


由此看出,事务发生了回滚。


使用注解方式实现声明式事务管理

实体类对象和上面一样


接下来编写DeptDao类

package cn.qblank.anno;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository("deptDao")
public class DeptDao {
	//容器注入jdbcTemplate对象
	@Resource(name="jdbcTemplate")
	private JdbcTemplate jdbcTemplate;
	public void save(Dept dept){
		String sql = "insert into dept(deptName) value(?) ";
		jdbcTemplate.update(sql,dept.getDeptName());
	}
}

LogDao类

package cn.qblank.anno;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Repository("logDao")
public class LogDao {
	@Resource(name="jdbcTemplate")
	private JdbcTemplate jdbcTemplate;
	@Transactional(propagation = Propagation.REQUIRED)
	public void insertLog(){
		jdbcTemplate.update("insert into t_deptLog(logName) value('插入一条dept表!!!')");
	}
}

编写DeptService注解注入属性

package cn.qblank.anno;

import javax.annotation.Resource;

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 DeptService {
	//注入IOC容器
	@Resource
	private DeptDao deptDao;
	@Resource
	private LogDao logDao;
	/**
	 * 事务控制
	 * @param dept
	 */
	public void saveLog(){
		logDao.insertLog();
	}
	/**
	 * 保存
	 * @param dept
	 */
	@Transactional(
			readOnly= false,	//设置只读属性
			timeout = -1,		//设置不限时
			isolation = Isolation.DEFAULT,	//隔离级别:默认
			propagation = Propagation.REQUIRED	//数据库的传播行为
	)
	public void save(Dept dept){
		deptDao.save(dept);
		saveLog();
	}
	
}

配置bean.xml文件,加载文件,配置数据源,注入jdbcTemplate实例,配置事务管理类,开启注解扫描,注解方式实现事务管理

<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	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/context
         http://www.springframework.org/schema/context/spring-context.xsd
         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">
    
    <!-- 1.加载配置文件db.properties -->
    <context:property-placeholder location="classpath:db.properties"/>
	<!-- 2.数据源配置 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name= "initialPoolSize" value="${jdbc.initPoolSize}"></property>
		<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
		<property name="maxStatements" value="${jdbc.maxStatements}"></property>
		<property name="acquireIncrement" value="${jdbc.acquireIncrement}"></property>
	</bean>
	<!-- 3.jdbcTemplate实例 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 4.事务管理类 -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	<!-- 5.开启注解扫描 -->
	<context:component-scan base-package="cn.qblank.anno"></context:component-scan>
	<!-- 6.注解方式实现事务 -->
	<tx:annotation-driven  transaction-manager="txManager"/>
</beans>

上面可以看到,我们再insertLog方法里面写了个异常,接下来我们来测试下是否回滚这个异常

首先弹出错误信息



接下来我们看看数据库是否发生回滚



可以发现数据库的数据并没有发生变化,所以我们回滚成功了!!!





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring声明式事务管理包括以下几个步骤:1. 在 Spring 配置文件中配置事务管理器;2. 使用 @Transactional 注解将需要事务管理的方法标注;3. 调用该方法,Spring 将自动开启事务并在事务结束时自动提交或回滚事务。 ### 回答2: Spring声明式事务管理使用步骤如下: 1. 配置数据源:首先需要配置数据源,用于连接数据库。可以使用Spring提供的内置数据源或者自定义数据源。 2. 配置事务管理器:使用Spring的TransactionManager来配置事务管理器,可根据需要选择不同的事务管理器,如DataSourceTransactionManager、JpaTransactionManager等。 3. 配置事务切入点:通过使用Spring提供的AspectJ表达式或者自定义切入点选择需要应用事务管理的方法。 4. 配置事务通知:使用Spring的TransactionInterceptor类来配置事务通知。可以在方法执行前、执行后或者执行出现异常时应用事务管理。 5. 配置AOP代理:通过使用Spring的AOP配置,将事务通知织入到需要应用事务管理的方法中。 6. 测试事务管理:在应用中调用需要应用事务的方法,并验证事务是否正确管理。 以上就是使用Spring声明式事务管理的步骤。通过配置数据源、事务管理器、事务切入点和事务通知来实现事务管理,并使用AOP代理将事务通知织入到方法中。最后可以进行测试,验证事务是否正确管理。使用Spring声明式事务管理可以大大简化事务管理的工作,并提高代码的可维护性和可重用性。 ### 回答3: Spring声明式事务管理使用步骤如下: 1. 配置数据源:首先,在Spring的配置文件中配置数据库的连接信息,包括数据库驱动类、连接URL、用户名和密码等。 2. 配置事务管理器:在配置文件中配置事务管理器,Spring提供了多种事务管理器的实现,如基于JDBC的DataSourceTransactionManager、基于JTA的JtaTransactionManager等,选择合适的事务管理器并配置。 3. 配置事务通知:使用Spring的事务通知功能,将需要事务管理的方法或者类标注上相应的注解,如@Transactional。这些被注解的方法或者类,在运行时会被Spring框架拦截并自动应用事务管理。 4. 配置事务属性:在注解中可以指定事务的传播行为、隔离级别、超时时间等属性,根据具体的业务需求进行配置。 5. 配置异常回滚策略:通过捕获和处理特定的异常,可以控制事务的回滚行为。可以使用注解中的rollbackFor属性指定需要回滚的异常类型。 6. 运行和测试:完成以上配置后,可以运行和测试应用程序。在方法调用时,被事务管理的方法将会受到事务拦截和控制。如果出现异常或者满足回滚条件,事务将会回滚,否则事务将会提交。 需要注意的是,Spring声明式事务管理是基于AOP实现的,在运行时使用代理对象对方法进行增强。配置声明式事务管理的步骤可以在Spring的配置文件中进行,也可以使用注解进行配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值