一.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的使用实例,接下来的章节我们将深入它底层源码的解析