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;
<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>
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://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>
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 {@Autowiredprivate 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);}}
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 {@Autowiredprivate 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);}}
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();}}
手写Spring事务框架
编程事务实现
概述
所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者
直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
案例
使用编程事务实现手动事务
使用编程事务实现,手动事务 begin、commit、rollback

spring事务环境搭建相关推荐

  1. Spring MVC 环境搭建(一)

    一.建立 JavaWeb 项目 1.建立一个 Java 项目. 2.在项目下新建一个文件夹 webapp (命名可自取,这个目录即是网站根目录),再在该文件夹下新建一个 WEB-INF 文件夹(命名固 ...

  2. 基于Intelli J IDE的Spring Boot 环境搭建

    一 Spring Boot的介绍 Spring Boot是一个全新的框架,是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. ...

  3. 番外:Spring MVC环境搭建和Mybatis配置避坑篇

    2019独角兽企业重金招聘Python工程师标准>>> web.xml引入对spring mvc的支持: spring-mvc配置spring-mvc: spring-mybatis ...

  4. Spring开发环境搭建和第一个示例程序

    前言 虽然之前用过Spring,但是今天试着去搭建依然遇到了困难,而且上网找教程,很多写的是在web里使用Spring MVC的示例,官方文档里的getting start一开始就讲原理去了(可能打开 ...

  5. [Spring MVC] - Spring MVC环境搭建

    1) 复制Spring所需要的lib包         (这是SSH所需要的lib包,如果只使用spring,可以移除一些包) 2) 配置web.xml <?xml version=" ...

  6. Spring开发环境搭建

    在spring开发中,我们要根据不同的情况来导入不同的jar包,如果我们要使用的是spring的ioc与di,那么对于ioc与di,我们只需要使用spring的核心功能. 1. beans相关 2. ...

  7. Struts2+Spring+Hibernate环境搭建

    为什么80%的码农都做不了架构师?>>>    IDE:MyEclipse8.5 Struts2:struts-2.3.20 Spring:spring-framework-4.1. ...

  8. Spring基础环境搭建

    创建一个父工程springdubbo,3个子工程分别为服务端provider,客户端consumer ,接口api 选择都选择maven quickstart即可 在main目录下面创建resourc ...

  9. Spring mvc环境搭建

    第一步,讲相关包拷贝到lib文件加下 第二步配置 WEB.CONFIG <?xml version="1.0" encoding="UTF-8"?> ...

最新文章

  1. 电信用户流失预测案例(3)
  2. vue中私有样式(scoped)中修改其他组件的样式
  3. swap函数_C++ vector成员函数实现[持续更新]
  4. Docker制作镜像(四)
  5. 基于注解方式@AspectJ的AOP
  6. eclipse下生成Java类图和时序图,生成UML图
  7. 计算机辅助翻译与人工翻译论文,计算机辅助翻译:理念和工具[翻译研究新探论文献文集].pdf...
  8. 创业15年,我对自己第一次的反省
  9. OpenAPI 开发者挑战赛第三期
  10. C#(int)中Convert、Parse、TryParse的区别
  11. ps写php,PS是什么
  12. 汽车营销与保险【1】
  13. OMNeT 例程 Tictoc15 学习笔记
  14. 测试网速_搭建Web SpeedTest网速测试工具
  15. java 拉勾网,拉钩网java笔试题分享
  16. python环境安装 (win7)
  17. 索尼投屏无法显示服务器,支持索尼Xperia 1投屏到电脑的方法推荐
  18. Oracle数据库上机练习2
  19. Python基本图形绘制
  20. 永磁同步发电机仿真,带四个牵引电机仿真。内燃机车仿真模型

热门文章

  1. 使用Spring提供Quartz来实现定时任务
  2. 浙江人22条经典经商法则(转载)
  3. 【Tomcat】如何解决catalina.out文件过大的问题
  4. 采用预取(Prefetch)来加速你的网站(转)
  5. 002-请你回答一下单元测试、集成测试、系统测试、验收测试、回归测试这几步中最重要的是哪一步...
  6. Linux网络编程基础(一)
  7. CSS-带尖角的对话框
  8. 查看Linux系统架构类型的5条常用命令
  9. 取得Access自增标识字段在插入数据后的id值
  10. python基本字符_Python基本字符串,基础,之