您的位置:首页 > 编程语言 > Java开发

spring事务环境搭建

2019-05-24 15:46 393 查看
[code]Spring事务里面主要是分为两种事务,一种是叫做编程事务,编程事务我们叫做手动事务,自己去begin,commit,rollback回滚,

这个是编程事务的,而起我刚才也讲过的,声明事务本质是使用编程事务和反射机制包装起来的,明天我们会手写一下声明式事务,

你们之前有没有用过JDBC的,你们看一下,在这个地方,编程事务实现,你们用过JDBC的话就知道,它是需要获取JDBC的事务模板之后,

然后你才去做begin和commit,我不知道你们有没有印象,我跟你们讲一下,框架会给我们提供一个事务接口的,这一点我要和你们讲一下,

本质上都是通过编程事务封装起来的,在这边我就讲个例子,讲个什么例子呢,把环境搭建起来,搭建一个数据库的环境,这边我直接把

代码copy过来,我先把环境搭建起来

CREATE TABLE IF NOT EXISTS `t_users`(
`NAME` INT UNSIGNED AUTO_INCREMENT,
`age` VARCHAR(100) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
[code]<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learn</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/javassist/javassist -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
<!-- 引入Spring-AOP等相关Jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.1_2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.37</version>
</dependency>
</dependencies>

</project>
[code]<?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"
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">

<!-- 这里表示扫包范围
因为我们是使用注解的,
-->
<context:component-scan base-package="com.learn"></context:component-scan>

<!-- 这里表示开启事务的注解
你如果想要事务的话,你必须开启一个事务注解,
-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> <!-- 开启事物注解 -->

<!-- 1. 数据源对象: C3P0连接池 -->
<!-- 第一步我们加载C3P0数据源
DBCP和C3P0的区别讲一下,数据库的连接池,
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/day20"></property>
<property name="user" value="root"></property>
<property name="password" value="123456"></property>
</bean>

<!-- 2. JdbcTemplate工具类实例  -->
<!-- 这里要引用到我的数据源 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 3.配置事务 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
</beans>
[code]package com.learn.dao;

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

/**
* 在UserDao里面我们写一个什么代码呢
* 是关于数据库的
*
* @author Leon.Sun
*
*/
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;

/**
* 表示我有一个add方法
* 有两个参数
* 叫name和age
*
*
* @param name
* @param age
*/
public void add(String name, Integer age) {
String sql = "INSERT INTO t_users(NAME, age) VALUES(?,?);";
int updateResult = jdbcTemplate.update(sql, name, age);
System.out.println("updateResult:" + updateResult);
}

}
[code]package com.learn.service.impl;

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

import com.learn.dao.UserDao;
import com.learn.service.UserService;

@Service
public class UserServiceImpl implements UserService {

@Autowired
private UserDao userDao;

public void add() {
/**
* 假设20岁
*/
userDao.add("test001", 20);
/**
* 我在这边打个断点大家看一下
* 没有事务为什么不提交到数据库里面去呢
* 走完之后立即提交
* 因为这边没有事务控制的
* 这边我去断点调试一下
* 这段代码走完之后数据库里面就有了
* 你有了之后后面报个错
* 你已经提交到数据库了就回滚不了了
* 就会产生数据库不一致的问题
*
*/
System.out.println("开始报错了..........................");
/**
* 我写一段代码int i = 1/0
* 这个时候我来问一下你们
* 会插入几条数据
* test001会成功
* test002会失败
* 只有一条成功了
* 我们看一下数据库里面
* 因为当他走到test002的时候
* 这个时候已经报错了
* 肯定不会往下继续执行了
* 这个程序直接中断了
* 后面的代码就不用走了
* 那这样的代码肯定不合理
* 我们要用事务来保证事务的一致性问题
* 是不是应该全部失败
* 而不是一个成功一个失败
* 是不是这样的
* 这个代码肯定有错
* 在这边我们可以用到事务
* 在这边我们可以采用事务了
* 把全部整个都做回滚
* 怎么做呢
* 在这边我就要详细给你们讲了
* 首先在这边我要问一下
* int i = 1/0;这行走完了之后
* 这个数据会不会添加到数据库里面去
* 你们说一下
* int i = 1/0这行走完的时候数据会不会添加到数据库里面去
* 肯定会的
*
*
*/
int i = 1/0;
/**
* 中间打印一个分隔符
*/
System.out.println("####################################");
/**
* 再来一个test002是21岁
*/
userDao.add("test002", 21);
}

}
[code]package com.learn.test;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.learn.service.UserService;

public class Test001 {

public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
UserService userService = (UserService) applicationContext.getBean("userServiceImpl");
userService.add();
}

}
[code]手写Spring事务框架
编程事务实现
概述
所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者
直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
案例
使用编程事务实现手动事务
使用编程事务实现,手动事务 begin、commit、rollback

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: