@Transactional 与@EnableTransactionManagement的使用及源码分析(一)

一.Spring事务

1.什么是声明式事务?

百度定义: 以方法为单位,进行事务控制;抛出异常,事务回滚,最小的执行单位为方法,决定执行成败是通过是否抛出异常来判断的,抛出异常即执行失败

2. Spring的声明事务实现

[1]事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Transactional 注解的方式,下面我们是针对注解的使用进行讲解
[2] @Transactional:事务注解,对我们的实例类进行事务声明
[3] @EnableTransactionManagement 事务管理注解,开启事务管理器,对声明了@Transactional的类进行管理

3.业务代码的实现:

前置工作:使用mysql数据库在自己新建的test 库中创建order表
在这里插入图片描述

[1]在pom.xml文件下导入相关依赖

<!-- 声明事务时使用的数据源 -->
<dependency>
	<groupId>c3p0</groupId>
	<artifactId>c3p0</artifactId>
	<version>0.9.1.2</version>
</dependency>
<!--声明数据库连接-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.44</version>
</dependency>
<!--声明数据库连接驱动-->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>

[2]编写主配置类Cap11MainConfig.java

其中的重要注解为:
@Configuration //解释为配置类
@ComponentScan(“com.enjoy.cap11”) //扫描该包下的相关注解
@EnableTransactionManagement //开启事务管理器,对@Transactional进行管理

package com.enjoy.cap11.config;

import java.beans.PropertyVetoException;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.mchange.v2.c3p0.ComboPooledDataSource;

@Configuration   //解释为配置类
@ComponentScan("com.enjoy.cap11")   //扫描该包下的相关注解
@EnableTransactionManagement  //开启事务管理器,对@Transactional进行管理
public class Cap11MainConfig {
	
	//创建数据源
	@Bean
	public DataSource dataSource() throws PropertyVetoException {
		//这个c3p0封装好的JDBC,dataSource接口的实现
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		dataSource.setUser("root");
		dataSource.setPassword("");
		dataSource.setDriverClass("com.mysql.jdbc.Driver");
		dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
		return dataSource;
	
	}
	//jdbcTemplate能简化增删改查操作
	@Bean
	public JdbcTemplate jdbcTemplate() throws PropertyVetoException {
		return new JdbcTemplate(dataSource());
	}
	//注册事务管理
	@Bean
	public PlatformTransactionManager platformTransactionManager() throws PropertyVetoException {
		return new DataSourceTransactionManager(dataSource());
	}

}

[3]编写操作数据库的Dao类 OrderDao.class

其中重要的注解
@Repository:声明为业务的Dao类,以便于@ComponentScan进行相关的扫描

package com.enjoy.cap11.dao;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class OrderDao {
	@Autowired
	private JdbcTemplate jdbcTemplate;
	
	//操作数据的方法
	public void insert() {
		String sql = "insert into `order` (ordertime,ordermoney,orderstatus) values(?,?,?)";
		jdbcTemplate.update(sql,new Date(),"20",0);
	}
	
}

[4]编写服务类OrderService.class

package com.enjoy.cap11.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.enjoy.cap11.dao.OrderDao;

@Service
public class OrderService {
	@Autowired
	private OrderDao orderDao;
	@Transactional
	public void addOrder() {
		orderDao.insert();
		System.out.println("操作完成.....");
		//int a = 1/0;
	}
}

[5]编写测试类

import org.junit.Test;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.enjoy.cap11.config.Cap11MainConfig;
import com.enjoy.cap11.service.OrderService;


public class Cap11Test {
	@Test
	public void test01() {

		AnnotationConfigApplicationContext app =
				new AnnotationConfigApplicationContext(Cap11MainConfig.class);
		OrderService bean = app.getBean(OrderService.class);
		bean.addOrder();
		app.close();
		
	}

}

总结

这就是@Transactional和@EnableTransactionManagement的使用实例,接下来的章节我们将深入它底层源码的解析

发布了41 篇原创文章 · 获赞 2 · 访问量 1989

猜你喜欢

转载自blog.csdn.net/TheWindOfSon/article/details/104221568