spring 声明式事务管理注解方式实现 - Go语言中文社区

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


使用注解实现Spring的声明式事务管理,更加简单!

步骤:

         1) 必须引入Aop相关的jar文件

         2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类

         3)在需要添加事务控制的地方,写上: @Transactional

 

@Transactional注解:

         1)应用事务的注解

         2)定义到方法上: 当前方法应用spring的声明式事务

         3)定义到类上:   当前类的所有的方法都应用Spring声明式事务管理;

         4)定义到父类上: 当执行父类的方法时候应用事务。

案例:

1.Dept实体类

<span style="font-family:Courier New;font-size:14px;">public class Dept {
	private int deptId;
	private String deptName;
	public int getDeptId() {
		return deptId;
	}
	//get set
	
}</span>
2.DeptDao 通过注解的方式注入-->因此要想找到JdbcTemple类需要在bean.xml配置文件中进行配置

<span style="font-family:Courier New;font-size:14px;">package cn.itcast.anno;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class DeptDao {
	//IOC容器注入
	@Resource
	private JdbcTemplate jdbcTemplate;
	public void save(Dept dept){
		String sql="insert into t_dept(deptName) values(?)";
		jdbcTemplate.update(sql,dept.getDeptName());
	}
}</span>
3.DeptService --->事务是在service层的.要想使用事务只需要在方法上添加@Transactional即可(添加到类上也可以 这样的话就对此类中的所有方法进行事务配置)
<span style="font-family:Courier New;font-size:14px;">package cn.itcast.anno;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class DeptService {
	//注入
	@Resource
	private DeptDao deptDao;
	@Transactional
	public void save(Dept dept){//如果这里加了事务 出错了 会自动回滚  都会保存失败
		//如果没有添加事务  出错了 第一个会保存成功
		deptDao.save(dept);
		
	}
}</span>
4.bean.xml---->要想使用注解事务 只需要在配置文件中指定注解实现事务

<span style="font-family:Courier New;font-size:14px;"><?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: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/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
        ">
       <!-- 数据库连接池的配置 -->
       <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
       		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
       		<property name="jdbcUrl" value="jdbc:mysql:///day15"></property>
       		<property name="user" value="root"></property>
       		<property name="password" value="169500"></property>
       		<property name="initialPoolSize" value="3"></property>
       		<property name="maxPoolSize" value="5"></property>
       		<property name="maxStatements" value="100"></property>
       		<property name="acquireIncrement" value="2"></property>
       </bean>
       <bean id="jdbcTemple" class="org.springframework.jdbc.core.JdbcTemplate">
       	<property name="dataSource" ref="dataSource"></property>
       </bean>
      <!-- 开启注解扫描 -->
      <context:component-scan base-package="cn.itcast.anno"></context:component-scan>
       <!-- -***************************spring声明式事务管理xml方式************************************************* -->
       <!-- 1.配置事务管理器 -->
       <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       	<property name="dataSource" ref="dataSource"></property>
       </bean>
       <!-- 注解方式实现事务: 指定注解方式实现事务-->
       <tx:annotation-driven transaction-manager="txManager"/>
       
</beans></span>

5.测试类App

<span style="font-family:Courier New;font-size:14px;">package cn.itcast.anno;

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

public class App {
	@Test
	public void test(){
		ApplicationContext ac=new ClassPathXmlApplicationContext("cn/itcast/anno/bean.xml");
		DeptService deptService=(DeptService) ac.getBean("deptService");
		Dept dept=new Dept();
		dept.setDeptName("annoTX");
		deptService.save(dept);
	}
}
</span>
运行结果测试:


事务总结:

如果使用spring提供的事务管理方式..假设在数据库层出现了错误.就会 回滚事务..数据库不会有数据

如果不采用事务..如果出现了错误..就不会回滚..数据库中会有数据.举例:

如果A转账给B A转账100给B..不使用事务.B出错了..事务不会回滚!A少了100 B没有增加

如果使用事务..则这个操作是在同一个事务下 .只要出错了事务就会回滚!可以保证用户的安全


版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u014010769/article/details/47174639
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-06 22:04:58
  • 阅读 ( 1229 )
  • 分类:研发管理

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢