@Transactional注解回滚(事物)
1 创建一个实体类,该类拥有的属性与数据库拥有的字段一一对应
import lombok.Data;
@Data
public class InterfaceTest {
private Integer interfaceId;
private String interfaceName;
private String interfaceType;
private String interfaceMethod;
private String interfaceAliasName;
}
2 数据库表拥有的字段
创建一个接口:写增删改查方法的接口,写入新增方法
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MyInterfaceTestMapper {
void addInterfaceTest(InterfaceTest interfaceTest);
}
创建一个xml文件:写增删改查sql的文件,写入新增sql
<mapper namespace="com.longteng.lesson2.my.mybatis.MyInterfaceTestMapper"><!--id就是接口中的方法名--><insert id="addInterfaceTest"useGeneratedKeys="true"keyColumn="interface_test_id"keyProperty="interfaceId"parameterType="com.longteng.lesson2.my.mybatis.InterfaceTest"><!--给哪个表插入数据,就写哪个表-->insert into interface_test<!--给哪些字段插入数据,就写哪些字段名-->(interface_name,interface_method,interface_type,interface_alias_name)<!--要插入的数据是对应的哪些字段,就是实体类里的字段,要与字段名的先后顺序一一对应,用#{}接收-->values (#{interfaceName},#{interfaceMethod},#{interfaceType},#{interfaceAliasName})</insert>
事物:通过@Transactional进行事物回滚
多个操作放在一起执行叫事物
例如一个下订单的业务
最先执行的是插入数据库,但是插入数据库成功后,后续业务并没有成功,下订单业务还没有完全操作完毕,这个时候其实下订单已经失败了,那么插入数据的那条数据就是脏数据了,要做的就是对于事物没有成功的数据做回滚操作
事物分为编程事物管理、声明事物管理,例子中实现的是声明事物
编程事物:自己控制回滚流程,多用于复杂系统
声明事物:@Transactional注解控制回滚流程,多用于简单流程
import com.longteng.lesson2.my.mybatis.InterfaceTest;
import com.longteng.lesson2.my.mybatis.MyInterfaceTestMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class InterfaceService {
//注入接口
@Autowired
MyInterfaceTestMapper myInterfaceTestMapper;
//出现异常回滚,一般不指定的情况下出现rollback、error的异常才会回滚,出现Exception异常是不会回滚的,这里就是指定一下出现Exception也要做回滚
@Transactional(rollbackFor = Exception.class)
//返回Object类型的带参方法,抛出一个异常
public Object test(Integer i) throws Exception{//创建实体类的实例,通过实例向数据库中添加数据InterfaceTest interfaceTest=new InterfaceTest();interfaceTest.setInterfaceName("qwer");interfaceTest.setInterfaceMethod("GET");interfaceTest.setInterfaceType("HTTP");interfaceTest.setInterfaceAliasName("QWER");//接口类实例调用接口的新增方法,添加数据到数据库int i=myInterfaceTestMapper.addInterfaceTest(interfaceTest);//如果方法传参i不等于1就抛出异常,若等于1就正常返回,添加成功if(i!=1){throw new Exception();}else {return "添加成功";}
}
}
controller中
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class MyInterfaceController {
//注入回滚的业务类
@Autowired
InterfaceService interfaceService;
@RequestMapping("/interfaceService")
public @ResponseBody Object test(Integer i)throws Exception{return interfaceService.test(i);
}
}
浏览器请求 http://127.0.0.1:8080/interfaceService?i=1 i=1 添加数据到数据库成功
浏览器请求 http://127.0.0.1:8080/interfaceService?i=2 i=2 添加数据到数据库失败
如果不用@Transactional,就算请求时i不等于1插入数据库也能成功
例子中,调用addInterfaceTest方法其实就是插入数据库操作,并且debug的话,sql的确是打印了,但是这个时候并没有插入数据库,因为用了回滚的注解,整个事物是一次提交,不是代码读到哪里就执行哪里,是等test方法整个执行完毕,才确定该sql要不要插入数据库
1 一般情况下一个方法(service层关于操作数据库的方法)就是一个事物
2 Spring事物的底层实现是靠AOP实现的
3 事物也是可以加在抽象类或者接口类上的,继承抽象类、实现接口类的那些子类也就继承到了事物这个类
@Transactional注解回滚(事物)相关推荐
- Spring中@Transactional事务回滚(含实例详细讲解,附源码)
一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...
- java SSM多操作注解回滚
在业务操作时难免会遇到一个业务多操作,会用到事物回滚这里写了一个简单的多操作失败事物回滚案例 在这之前你需要在你的applicationContext-mybatis.xml中配置: <!-- ...
- @Transactional事务回滚使用
使用:作用于类时,对该类下所有public方法都有效,也可写在某个方法上,当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息 回滚方式: ...
- Java的@Transactional事务回滚
@Transactional 基本原理概述 在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@ ...
- 查看回滚事物sql_卧槽:这款 SQL自动检查神器,吊炸天的功能,真TMD多!!
介绍 Yearning MySQL 是一个SQL语句审核平台.提供查询审计,SQL审核等多种功能,支持MySQL ,可以在一定程度上解决运维与开发之间的那一环,功能丰富,代码开源,安装部署容易! 开源 ...
- Spring的Transactional注解
Spring的Transactional注解主要有以下功能: 1. 标注在方法上,如果该方法掉了多个别的方法,每个方法都有对数据库做数据更改,如果这些更改需要保持一致性,这时就可以用到这个注解. 2. ...
- JAVA事务回滚的使用方法
假设这是一个service类的片段 try{ //出现异常 } catch (Exception e) { e.printStackTrace(); ...
- spring事务管理中,用try-catch处理了异常,事务也会回滚?
在平时的开发中,如果在事物方法中用 try-catch处理了异常,那么spring aop不能捕获到异常信息,从而会导致spring不能对事务方法正确的进行管理,不能及时回滚错误信息. 下面用代码演示 ...
- 学习@Transaction异常自动回滚以及手动回滚和回滚部分SQL服务
学习@Transaction异常回滚 一.第一种注解回滚 二.第二种手动回滚 三.第三种部分回滚 一.第一种注解回滚 @Service public class TransactionServiceI ...
最新文章
- vagrant up报错 Warning: Authentication failure. Retrying...解决方案
- Go 语言编程 — net/http — HTTP 服务端
- 企业网络推广——企业网络推广专员讲述网站友链交换如何做
- HIGHGUI ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
- 企业日志分析之linux系统message收集展示
- pythonargmaxaxis1_详解numpy的argmax的具体使用
- Zookeeper分布式锁的使用
- 企业实战_03_Redis基础命令
- python字符串命名_python-字符串及其常用方法
- spark写入oracle 优化,spark读写数据库大表分区性能优化
- Linux初级阶段学习笔记-本地源YUM配置
- 给ecshop后台增加管理功能页面
- Linux基础-1.Linux命令及获取帮助
- 23种设计模式(6):模版方法模式
- 软件系统的测试计划,软件系统测试计划-模板
- 李宏毅2020机器学习深度学习(完整版)国语课程PPT
- Word 远程调用失败:异常来自 HRESULT:0x800706BE
- 【C++ 程序】 TVJ Complex Calculator (v 2.1) 复数计算器
- 谷仓的安保【DFS】
- 教你识别思科交换机型号
热门文章
- oracle 按每分钟分组,oracle按每个10分钟进行分组展示数据
- Intel 酷睿 i3、i5、i7 CPU 处理器之间有什么区别
- 多种JS刷新页面代码!
- c语言实现alsa播放
- 【linux】posix是什么都不知道,还好意思说你懂Linux?
- 【0基础强力推荐】R语言快速入门
- pythonidle怎样显示行号_给Python IDLE添加行号显示
- java输入两个整数_求平均值._用C语言编写:完成从键盘输入两个整数a和b,求平均值ave,并输出平均值...
- 廖雪峰Python基础笔记
- 2022-04-26:给定四个整数 sx , sy ,tx 和 ty,如果通过一系列的转换可以从起点 (sx, sy) 到达终点 (tx, ty),则返回 true,否则返回 false。 从点 (x