mysql事务回滚机制概述】的更多相关文章

应用场景:   银行取钱,从ATM机取钱,分为以下几个步骤       1 登陆ATM机,输入密码:    2 连接数据库,验证密码:    3 验证成功,获得用户信息,比如存款余额等:    4 用户输入需要取款的金额,按下确认键:    5 从后台数据库中减掉用户账户上的对应金额:    6 ATM吐出钱:    7 用户把钱拿走.    对于上面的取钱这个事情,如果有一步出现错误的话,那么就会取消整个取钱的动作,但是如果在第5步,系统后台已经把钱减了,但是ATM机没有取出来,那么就应用到m…
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销. 要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修 改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依 旧是未修改之前的状态,而第一个表已经被修改完毕.而当你把它们设定为一个 事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和 第二个表都要回到未修改的状态,这就是所谓的事务回滚…
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个 不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤 销.要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修 改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依 旧是未修改之前的状态,而第一个表已经被修改完毕.而当你把它们设定为一个 事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和 第二个表都要回到未修改的状态,这就是所谓的事务回滚.…
事务回滚后,自增ID仍然增加,回滚后,自增ID仍然增加.比如当前ID是7,插入一条数据后,又回滚了.然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9.因为虽然你之前插入回滚,但是ID还是自增了. 如果你认为自增ID不应该被事务化,那么其他事务不得不等待着,检查自增ID是被使用还是被回滚,这就导致阻塞. 比如下面的例子,A表使用自增ID. User ------------ begin transaction insert into A ... insert into B ...…
什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括与银行系统的交互 · 生成订单并且保存到数据库中 · 更新用户相关信息,例如购物数量等等 正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新.但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常.该顾客银行帐户存款不足等,都将导致交易失…
初学者笔记 问题:在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常. 一.特性 先了解一下@Transactional注解事务的特性,可以更好排查问题 1.service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方式. 2.@Transactional 注解只能应用到 publ…
使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常则不进行回滚操作.那么什么是检查型异常什么又是非检查型异常呢?最简单的判断点有两个:1.继承自RunTimeException或error的是非检查型异常,而继承自exception的则是检查型异常(当然,runtimeexception本身也是exception的子类).2.对非检查型类异…
begindeclare t_error integer default 0;  //添加变量t_error并赋初始值为0declare continue handler for sqlexception set t_error=1; //发生错误变量t_error值改为1(无论是否发生错误都会一直执行) #set autocommit =0;   //autocommit=0,自动提交.用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的…
1:事务原理 1.2:aop/动态代理 类路径:org/springframework/aop/framework/CglibAopProxy.java ReflectiveMethodInvocation#proceed 后续: 1.2:threadLocal 1.3:事务核心代码 org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction /** * 每个被 @Tra…
今天做数据迁移, 发现事务有时候可以回滚, 有时候不可以回滚, 最后一点点调试发现中间有段修改表结构的语句, 最终导致回滚失败. 1.MySQL最常用的两个表类型: InnoDB和MyISAM.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持.存储过程.视图.行级锁定等等高级数据库功能,若回滚失败,先检查表类型. SHOW ENGINES 语句可以查看当前的数据库支持的存储类 SHOW CREATE TABLE 表名;可以查看表的…
MySQL自己的 mysqlbinlog | mysql 回滚不好用,自己写个简单脚本试试: 想法是用mysqlbinlog把需要回滚的事务区域从mysql-bin.file中找到,然后通过脚本再插入DB. ## INSERT 需要将新增数据删除 对应DELETE ## DELETE 需要将删除数据恢复 对应INSERT ## UPDATE 需要将修改数据恢复 对应UPDATE ## 手动读取BINLOG,并找到对应位置和对应事务 ## 手动删除除事务外的其他说明语句 INSERT回滚最简单,其…
1.原因: 单元测试的时候频繁操作数据库需要修改很多数据,造成不必要的操作,添加事务之后就可以重复对一条数据进行操作,并且在返回结果后进行回滚. 2.解决: 原先继承的是  AbstractJUnit4SpringContextTests  这个类,这个类不支持事务机制,换成 AbstractTransactionalJUnit4SpringContextTests 后则默认每条测试方法都是完成后回滚. @ContextConfiguration(locations = {"classpath:…
首先条件是表要设置为 InnoDB  类型. 当在一个库连接中,通过调用另一个 库名称.表名称,可以回滚: 当用USE dbName后,在两个或多个库操作时,一次只能回滚一个库中的东西: 当在多个数据库连接(link)中时,只能每个单独开启事物.单独回滚. 当在一个库连接中调用另一个库中的数据时, 可以直接用 库名+表名 调用另一个库中的东西 或者 克隆当前连接后,把克隆后的连接再用 USE DB_NAME ,这样就产生了两个连接.…
因为innodb的auto_increament的计数器记录的当前值是保存在存内 存中的,并不是存在于磁盘上,当mysqlserver处于运行的时候,这个计数值只会随着insert改增长,不会随着delete而减少.而当mysqlserver启动时,当我们需要去查询auto_increment计数值时,mysql便会自动执行:SELECT MAX(id) FROM 表名FOR UPDATE;语句来获得当前auto_increment列的最大值,然后将这个值放到auto_increment计数器中…
应用场景:   银行取钱,从ATM机取钱,分为以下几个步骤       1 登陆ATM机,输入密码:    2 连接数据库,验证密码:    3 验证成功,获得用户信息,比如存款余额等:    4 用户输入需要取款的金额,按下确认键:    5 从后台数据库中减掉用户账户上的对应金额:    6 ATM吐出钱:    7 用户把钱拿走.    对于上面的取钱这个事情,如果有一步出现错误的话,那么就会取消整个取钱的动作,但是如果在第5步,系统后台已经把钱减了,但是ATM机没有取出来,那么就应用到m…
论坛扣币项目中,用户支付论坛币的时候如果突然断网.电脑死机.停电.等其它自然灾害时,导致本次交易没有成功(即用户的币已经扣掉了,但是服务器数据库中没有消费记录等其它情况),这种情况应该怎么样进行处理呢?在这个时候,我们可以用Mysql事务回滚来进行处理,那代码怎么写呢? 那下面我就来说一说这个mysql事务回滚应该怎么处理.首先MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!那如果,我们的数据表已经存在,并且不是上面所说的两种类型的话,应该怎么办呢?1.我…
其实用PHP来处理mysql的事务回滚并不难,下面小编就详细的为大家介绍一下.相信大家看完之后都知道如何使用 很多新手在进行项目过程中,会碰到这样一种情况,如:论坛扣币项目中,用户支付论坛币的时候如果突然断网.电脑死机.停电.等其它自然灾害时,导致本次交易没有成功(即用户的币已经扣掉了,但是服务器数据库中没有消费记录等其它情况),这种情况应该怎么样进行处理呢?在这个时候,我们可以用Mysql事务回滚来进行处理,那代码怎么写呢? 那下面我就来说一说这个mysql事务回滚应该怎么处理.首先MYSQL…
C#中批量处理数据,有时候因为一条记录导致整个批量处理失败.这时候肯能会导致数据不全等问题,这时候我们可以使用SqlTransaction来进行事务回滚,即是要么全部成功要么全部不成功.如下代码 //测试事务回滚 public static string GetMsgBySJ() { var msg = ""; SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = conn.CreateCommand();…
今天客户提出一个新问题,出库一批商品,提示失败了,但是库存数量却减少了.看了一下代码一头雾水,我们的代码加了事物,且捕获异常. 经过调试代码发现就是两个原因导致的 第一.在当前方法的catch中处理了捕获的异常,没有向上抛出异常,事务不能回滚 分析: 1.在Java中异常的基类为Throwable,他有两个子类Exception与Errors,同时RuntimeException就是Exception的子类: 2.RuntimeException,即运行时异常,为非受检(UNCHECKED)异常…
mysql索引 索引相当于书的目录优点:加快数据的查询速度缺点:占物理存储空间,添加,删除,会减慢写的速度 查看表使用的索引 mysql> show index from 表名\G;(\G分行显示) mysql> show index from mysql.db; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+-…
add by zhj: 看来我对MySQL的理解还有待深入,水还是挺深的啊,MySQL给记录加锁时,可以通过innodb_lock_wait_timeout参数设置超时时间, 如果加锁等待超过这个时间,就会回滚,但回滚的话有两种方式:第一种:回滚当前加锁的这条语句:第二种:回滚整个事务.这两种方式是通过参数 innodb_rollback_on_timeout来控制的.如果是OFF,表示加锁超时回滚时,只回滚加锁超时的那条SQL语句:如果是ON,表示回滚整个事务.默认 是OFF.在<MySQL…
spring boot 事务管理,使用事务的回滚机制 1:配置事务管理 在springboot 启动类中添加 @EnableTransactionManagement //开启事务管理 @EnableAsync(proxyTargetClass=true) //配置代理为cglib代理,默认使用 的是jdk动态代理 2:配置管理器 package com.li; import javax.sql.DataSource; @EnableAutoConfiguration @SpringBootAp…
1.存储引擎(处理表的处理器) 1.基本操作 1.查看所有存储引擎 mysql> show engines; 2.查看已有表的存储引擎 mysql> show create table 表名; 3.创建表指定存储引擎 create table 表名(...)engine=myisam; 4.已有表修改存储引擎 alter table 表名 engine=innodb; 2.锁 1.目的 :解决客户端并发访问的冲突问题 2.锁分类 1.锁类型 1.读锁(共享锁) select :加读锁之后别人不…
1. 在操作事务的时候,如果发现当前事务操作是不合理的,此时只要还没有提交事务,就可以通过回滚取消当前事务,接下来就针对事务的回滚进行详细讲解. 2. 为了演示回滚操作,在上一个笔记案例基础之上,此时a账户有1000元,b账户也有1000元,开启一个事务,通过update语句将a账户的100元转给b账户,具体语句,如下: start transaction; where name='a'; where name='b'; 上述语句执行成功之后,使用select语句查询a和b账户,如下: 此时a账…
<?php $conn = mysql_connect('127.0.0.1', 'root', ''); mysql_select_db('msc_test'); mysql_query('SET NAMES UTF8'); # 开启事务 mysql_query("START TRANSACTION"); $sql1 = "INSERT INTO `msc_user` VALUES ('1', 'msc', '男', '1991')"; $sql2 = &q…
主要内容: ***数据定义语言DDL重点 ***数据操纵语言DML重点 数据查询语言DQL重点 ---事务控制语言TCL ---数据库控制语言DCL ---主键(primary key) ---数据冗余(另外建表,把某个外建与另一个表的主键建立关系联系起来) ---事务 ***数据定义语言DDL重点 定义:DDL(Data Definition Language):负责数据结构定义与创建数据库对象的语言. 负责数据结构定义与创建数据库对象的语言. 常用的有create alter drop  …
转载: Spring中@Transactional事务回滚 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Tran…
1.事务控制概述   1.1.编程式事务控制         自己手动控制事务,就叫做编程式事务控制.         Jdbc代码: connection.setAutoCommit(false);  // 设置手动控制事务         Hibernate代码: session.beginTransaction();   // 开启一个事务                                transaction.rollback();  //事务回滚       [细粒度的事…
项目中用到了MongoDB,准备用来存储业务数据,前提是要实现事务,保证数据一致性,MongoDB从4.0开始支持事务,提供了面向复制集的多文档事务特性.能满足在多个操作,文档,集合,数据库之间的事务性,事务的特性.多文档事务在4.0版本仅支持复制集,对分片集群的事务性支持计划在4.2版本中实现.由于我也算是一个java小白,没怎么弄清java事务机制,于是先建了个测试项目进行测试.在本例中可以看到多数据源下事务的使用,请重点关注后面记录的爬坑记. 代码已上传到github 传送门 https:…
Spring.EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚 /** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*)配置事务在什么情况下回滚(格式:-引起回滚的异常类型) * 则spring默认只会在service方法抛出unchecked exception才会触发回滚 */ public class TestServiceImpl extends Service implements TestService …