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
相关文章推荐
- 12-spring的事务管理(转账环境搭建一)
- Spring之声明式事务Transaction-环境搭建
- Spring中使用事务搭建转账环境方法二 相对简便的注解方法 ——配置文件注入对象属性需要setter方法 注解方法,不需要生成setter方法
- Spring中使用事务搭建转账环境 转账操作一个账户要减少资金操作一个账户要增加资金操作,如果在两个操作间出现异常转账失败 所以要使用事务
- Spring中使用事务搭建转账环境方法二 相对简便的注解方法 ——配置文件注入对象属性需要setter方法 注解方法,不需要生成setter方法
- Spring学习-30:Spring中的事务管理之环境搭建
- spring的事务管理(配置文件方式和注解方式实现、转账环境搭建)
- IntelliJ IDEA spring mvc +mybatis 环境搭建服务器(下)
- spring+struts环境搭建
- springmvc+hibernate环境,事务细节
- Spring学习环境搭建
- Maven搭建Spring+Struts2+Mybatis项目(一) Maven环境
- Spring源码学习(一)—工具准备和环境搭建
- (一)spring boot 不继承parent搭建环境-入门
- 搭建Spring3开发环境
- 【SSH进阶之路】Spring简介,搭建Spring环境——轻量级容器框架(一)
- 基于spring boot 及mybatis的web开发环境搭建
- Spring的AOP机制---- 环境搭建---- 环境搭建
- springmvc+freemarker环境搭建(超简单)
- 搭建Spring开发环境并编写第一个Spring小程序