回滚

事务的传播行为和隔离级别

吃可爱长大的小学妹 提交于 2020-01-04 01:31:10
事务使用步骤如下: 步骤一、在spring配置文件中引入<tx:>命名空间 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 步骤二、具有@Transactional 注解的bean自动配置为声明式事务支持 <!-- 事务管理器配置, Hibernate单数据源事务 --> <bean id="defaultTransactionManager" class="org.springframework.orm.hibernate3

Spring嵌套事务几种情形

北城以北 提交于 2020-01-03 15:46:20
为了方便,使用伪代码表示:) 1、同一个类,两个方法上都有事务 class A { @Transactional function T1() { curd 操作1 T2() } @Transactional function T2() { curd 操作2 抛异常 } } 结果:操作1和操作2都回滚 2、同一个类,被调用的方法上才有事务 class A { function T1() { curd 操作1 T2() } @Transactional function T2() { curd 操作2 抛异常 } } 结果:操作1和操作2 都不 回滚 3、同一个类,主方法上才有事务 class A { @Transactional function T1() { curd 操作1 T2() } function T2() { curd 操作2 抛异常 } } 结果:操作1和操作2都回滚 4、不同类,两个方法上都有事务 class A { @Transactional function T1() { curd 操作1 B.T2() } } class B { @Transactional function T2() { curd 操作2 抛异常 } } 结果:操作1和操作2都回滚 5、不同类,被调用的方法上才有事务 class A { function T1() { curd 操作1 B

MySQL数据库事务详解

こ雲淡風輕ζ 提交于 2020-01-01 05:30:05
微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。 ​ 事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 例如:A向B转账100元,对应于如下两条sql语句: update from account set money=money+100 where name='b'; update from account set money=money-100 where name='a'; 1 2 1 2 数据库 默认事务是自动提交的,也就是发一条sql它就执行一条,如果想多条sql放在一个事务中执行,则需要使用如下语句: start transaction … … commit 1 2 3 4 1 2 3 4 数据库开启事务命令: start transaction :开启事务 rollback :回滚事务 commit :提交事务 MySQL数据库中操作事务命令 编写 测试 SQL脚本,如下: /* 创建数据库 */ create database day16

spring boot controller设置 @Transactional 不回滚的解决办法

主宰稳场 提交于 2019-12-27 12:28:39
在spring boot 中,使用事务非常简单,直接在方法上面加入 @Transactional 就可以实现,以下是我的做法 @GetMapping("delete") @ResponseBody @Transactional public void delete(@RequestParam("id") int id){ try { //delete country this.repository.delete(id); if(id == 1){ throw Exception("测试事务"); } //delete city this.repository.deleteByCountryId(id); }catch (Exception e){ logger.error("delete false:" + e.getMessage()); return new MessageBean(101,"delete false"); } } 发现事务不回滚,即 this .repository.delete(id); 成功把数据删除了。 原因: 默认spring事务只在发生未被捕获的 RuntimeException 时才回滚。 spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获

mybatis学习八 事物

一笑奈何 提交于 2019-12-27 02:47:13
1.事物的定义: 是指作为单个逻辑工作单元执行的一系列 操作 ,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。 2,事物的特性: 一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。 3. mybatis中的事物   3.1, 在 mybatis 中默认是关闭了 JDBC 的自动提交功能     3.1.1 每一个 SqlSession 默认都是不自动提交事务.     3.1.2 session.commit()提交事务.     3.1.3 openSession(true);自动提交.setAutoCommit(true);   3.2 mybatis 底层是对 JDBC 的封装.     3.2.1 JDBC 中 executeUpdate()执行新增,删除,修改的 SQL.返回值 int,表示受影响的行数.     3.2.2 mybatis 中<insert> <delete> <update>标签没有 resultType 属性,认为返回值都是 int   3.3 在 openSession()时 Mybatis 会创建 SqlSession 时同时创建一个Transaction(事务对象),同时     autoCommit 都为 false

事务模型

我的未来我决定 提交于 2019-12-26 20:57:10
3种事务模型 本地事务模型 本地事务模型的名称来自于它实际上不是管理事务的框架,而是本地资源管理器。资源管理器是与之通信的数据源的实际提供者。例如,对于数据库,资源管理器是通过数据库驱动程序和DBMS实现的。对于JMS,资源管理器是通过特定的JMS提供程序实现的队列(或主题)连接工厂。使用本地事务模型,开发人员管理连接,而不是事务。实际管理本地事务的是DBMS或JMS提供程序。关于本地事务, 事实是事务管理由底层数据库(DBMS)处理,如果是jms,则由底层消息传递提供程序处理。从开发人员的角度来看,我们不管理本地事务模型中的事务,而是管理连接 。下面的代码示例演示了使用直接JDBC代码的本地事务模型的使用: public void updateTradeOrder(TradeOrderData order) throws Exception { DataSource ds = (DataSource) (new InitialContext()).lookup( "jdbc/MasterDS"); Connection conn = ds.getConnection(); conn.setAutoCommit(false); Statement stmt = conn.createStatement(); String sql = "update trade_order ...

MySQL的四种事务隔离级别

孤人 提交于 2019-12-26 10:23:49
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID)    1、原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。    2、一致性(Consistency): 事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。    3、隔离性(Isolation): 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。    4、持久性(Durability): 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。 二、事务的并发问题   1、脏读: 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据   2、不可重复读: 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。   3、幻读: 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级

Mysql数据库表的类型有哪些

家住魔仙堡 提交于 2019-12-26 03:43:45
截至目前,MySQL一共向用户提供了包括DBD、HEAP、ISAM、MERGE、MyIASM、InnoDB以及Gemeni这7种Mysql表类型。其中DBD、InnoDB属于事务安全类表,而其他属于事务非安全类表。 DBD Berkeley DB(DBD)表是支持事务处理的表,由Sleepycat软件公司开发。它提供MySQL用户期待已久的功能--事务控制。事务控制在任何数据库系统中都是一个极有价值的功能,因为它们确保一组命令能成功地执行或回滚。 HEAP HEAP表是MySQL中存取数据最快的表。这是因为他们使用存储在动态内存中的一个散列索引,不过如果MySQL或服务器崩溃,这些内存数据将会丢失。 ISAM ISAM表是早期MySQL版本的缺省表类型,直到MyIASM开发出来。建议不要再使用它。 MERGE MERGE是一个有趣的新类型,在3.23.25之后出现。一个MERGE表实际上是又一个MyISAM表的集合,合并而成的一个表,主要是为了效率的考虑,因为这样不仅仅可以提高速度、搜索效率、修复效率而且还节省了磁盘空间。 MyIASM MyIASM基于了IASM代码,应该可以说是IASM的衍生品,不过增加了不少有用的扩展。它是MySQL的默认数据表类型,基于了传统的ISAM类型,ISAM是Indexed Sequential Access Method(有索引的顺序访问方法

git回滚命令reset、revert的区别

微笑、不失礼 提交于 2019-12-26 01:26:41
##使用git,总有一天会遇到下面的问题: (1)改完代码匆忙提交,上线发现有问题,怎么办? 赶紧回滚。 (2)改完代码测试也没有问题,但是上线发现你的修改影响了之前运行正常的代码报错,必须回滚。 所以git的取消提交、回退甚至返回上一版本是比较重要的。 大致分为下面2种情况: 1、没有push 这种情况发生在你的本地代码仓库,可能你add、commit以后发现代码有点问题,准备取消提交,用reset git reset \--soft | --mixed | --hard 参数说明: --soft:保留源码,只回退commit信息到某个版本,不涉及index的回退。如果还需要提交,直接commit即可。 --mixed:会保留源码,只是将git commit和index的信息回退到了某个版本。(git reset默认的就是--mixed模式,即git reset等价于git reset --mixed) --hard:源码也会回退到某个版本,commit和index都会回退到某个版本。(注意这种方式是会改变本地代码仓库源码)   当然有人在push代码以后,也使用 reset --hard 回退代码到某个版本之前。但是这样会有一个问题,你线上的代码没有变,线上commit、index都没有变,当你把本地代码修改完提交的时候你会发现全是冲突........所以

mybatis事物回滚

ε祈祈猫儿з 提交于 2019-12-25 20:37:45
1.添加: 添加@Transactional注解 2.如下代码: @Transactional public void insertLecturerMemberFans(PageData pd) throws Exception { pd.put("createDate", new Date()); dao.save("TLecturerMapper.insertLecturerMemberFans", pd); throw new RuntimeException("参数错误,事物回滚"); } 当第三行抛出异常时,第二行已经添加的数据回滚 3.@Transactional事务几点注意 这里面有几点需要大家留意: A. 一个功能是否要事务,必须纳入设计、编码考虑。不能仅仅完成了基本功能就ok。 B. 如果加了事务,必须做好开发环境测试(测试环境也尽量触发异常、测试回滚),确保事务生效。 C. 以下列了事务使用过程的注意事项,请大家留意。 1. 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。 2.不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法