精华内容
下载资源
问答
  • 数据库事务回滚
    千次阅读
    2021-12-09 19:59:44

    1. 事务特性

    应该具有4个属性:原子性一致性隔离性持久性。这四个属性通常称为ACID特性。*

    1- 原子性(atomicity)
    一个事务是一个不可分割的工作单位,事务中包括的所有操作要么全部提交成功,要么全部失败回滚。对于一个事务来说,不可能只执行其中的一部分操作。

    最经典的例子:我给你转了10000RMB(大方点hh),你的账号会多10000块,我的账户会少10000块。
    (这是个资金的流转,要么同时成功,要么同时失败)

    begin; -- 开始一个事务
    update table set A = A - 100; 
    update table set B = B + 100;
    -- 其他操作
    commit; -- 提交事务
    

    begin和commit之间所有操作完成后,才能成功保存到数据库
    只要有一条操作失败,就撤销之前的操作,这要就保证了同生共死


    2- 一致性(consistency)

    • 事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

    一 个或多个事务执行后,原来一致的数据和数据库仍然是一致的。
    数据库总是从一个一致性的状态转换到另外一个一致性的状态。在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,CMBC账户中也不会损失100万,不然因为事务最终没有提交会导致很严重的影响,所以事务中所做的修改也不会保存到数据库中。


    3- 持久性(durability)

    • 持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。持久性是个有点模糊的概念,因为实际上持久性也分很多不同的级别。有些持久性策略能够提供非常强的安全保障,而有些则未必。而且「不可能有能做到100%的持久性保证的策略」否则还需要备份做什么。

    4- 隔离性(isolation)
    通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时如果有其他人也准备给lemon的CMBC账户存钱,那他看到的CMBC账户里还是有100万的。

    2、拓展:事务隔离级别

    脏读


    在事务A修改数据之后提交数据之前,这时另一个事务B来读取数据,如果不加控制,事务B读取到A修改过数据,之后A又对数据做了修改再提交,则B读到的数据是脏数据,此过程称为脏读Dirty Read。


    不可重复读


    一个事务内在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了变更、或者某些记录已经被删除了。


    幻读


    事务A在按查询条件读取某个范围的记录时,事务B又在该范围内插入了新的满足条件的记录,当事务A再次按条件查询记录时,会产生新的满足条件的记录(幻行 Phantom Row)


    3、相关问题

    (1)不可重复读与幻读有什么区别?
    不可重复读:第一次读的数据和第二次读的「数据不一样」。(因为中间有其他事务提交了修改)
    幻读:第一次和第二次读出来的「记录数不一样」。(因为中间有其他事务提交了插入/删除)

    (2)如何保证隔离性(Isolation):
    有多个事务同时进行,最后结束时,最终的结果应该是相同的
    原子性的问题解决了,但是在另外的事务中同时修改数据,数据的一致性就会被破坏,所以要有隔离机制,一个事务完成后,另一个事务才能开始,要加上互斥锁。
    具体步骤:
    1.先获得锁,然后才能修改数据A
    2.修改并提交事务之后释放锁,给下一个要修改数据A的事务
    3.然后第二个事务开始修改数据并提交。
    对于同一个数据,只有一个事务能持有互斥锁,没有锁的事务,需要等待其他事务释放锁
    只有当事务提交或者回滚后,才能释放锁。在这期间,其他事务只能读取数据

    (3)隔离级别:
    1.串行化:最高的隔离级别,两个事务百分百隔离,串行执行。
    2.可重复读(MySQL默认模式):这些数据对其他正在执行的事务是可见的。如果成功修改了一条数据,修改结果对于正在运行的事务仍然不可见。所以只是对于新数据产生了新隔离,旧数据还是旧隔离。
    3.读取已提交(Read committed,Oracle、PostgreSQL、SQL Server默认模式):可重复读+新的隔离突破,A事务在读取D数据时,B事务对D数据进行了删除或者修改操作并提交,A重新读取时就会看到B事务修改以后的数据。A事务在第一次读取的数据和第二次数据不一样,这叫幻读
    4.读取未提交:读取已提交+新的隔离突破:A事务在读取D数据时,B事务对D数据进行了删除或者修改操作并提交,A重新读取时就会看到B事务修改以后的数据。但是此时B事务出错回滚了,A还是会看到B事务修改的数据结果,看到的数据是毫无用处的,这叫脏读
    此部分原文链接:https://blog.csdn.net/weixin_43326401/article/details/104003945

    更多相关内容
  • sql 回滚语句这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份或不能备份日志(truncate log on checkpoint选项为1),那幺就无法进行数据的恢复了,或者只能恢复到最近一次的...

    sql 回滚语句

    这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份

    或不能备份日志(truncate log on checkpoint选项为1),那幺就无法进行数据的恢复了,或者

    只能恢复到最近一次的备份的数据了。

    以下简单说明恢复数据方法:

    1,如果误操作之前存在一个全库备份(或已有多个差异备份或增量备份),首先要做的事就是进

    进行一次日志备份(如果为了不让日志文件变大而置trunc. log on chkpt.选项为1那你就死翘了)

    backup log dbName to disk='fileName'

    2,恢复一个全库备份,注意需要使用with norecovery,如果还有其他差异或增量备份,则逐个恢

    restore database dbName from disk='fileName' with norecovery

    3,恢复最后一个日志备份即刚做的日志备份,指定恢复时间点到误操作之前的时刻

    restore log dbName from disk='fileName'

    with stopat='date_time'

    以上这些操作都可以在SQL SERVER企业管理器里完成,难度不大。。。

    当然,如果误操作是一些不记日志的操作比如truncate table,select into等操作,那幺是无法利

    用上述方法来恢复数据的...

    sql server能回滚?如我不小心执行了delete from record_qlq 怎幺回滚

    sqlserver 的编辑器一般都是默认自动提交,也就是说你删除后,就自动提交了;不能回滚。

    当然如果你设置成不是默认提交的话,那幺你在提交之前可以回滚。

    而如果是程序代码中删除的话,看你有没有启用事务,如果没有启用事务,那幺一般也是默认提交的,如果启用事务,那幺再提交前可以回滚,如果已经提交了,那幺就回滚不了了。

    数据库(sql server )回滚事务

    --开始一个事务处理

    Begin Tran T1

    --执行插入操作

    insert into [选课表]([学号],[课程代码]) values('20100021','01');

    insert into [选课表]([学号],[课程代码]) values('20100021','02');

    insert into [选课表]([学号],[课程代码]) values('20100021','03');

    --判断同一学号的选课数量是否符合

    IF(select count([学号]) as 空白t from [选课表] where [学号]='20100021')>4

    BEGIN

    --不符合,回滚事务

    rollback Tran T1

    END

    ELSE

    BEGIN

    --符合,提交事务

    空白mit Tran T1

    END

    sql server 2008 执行语句后怎幺恢复

    1、SQL的操作无法撤消,无法恢复.值改了就改了,没法退回.

    如果你有备份,因为数据库有新旧差异,不要直接在原数据库上做恢复,你把备份的数据恢复到一个新的数据库上,再看一下你修改的那个列表的原来的值是多少,再修改回这个值,就行了.

    直接操作数据库,请切记避免误操作,很烦的.

    2、或是你可以逆执行执行过的sql,比如insert的话用delete删除,不过这得视情况而定了

    SQL回滚的作用什幺?

    撤消操作

    如:

    begin tran

    insert t select 1

    rollback tran

    sql server 中的update语句回滚怎幺写啊

    回滚要放在事务里面进行,才能进行回滚;sql里面的事务使用关键字TransAction

    1:可以用try catch捕获

    begin try

    begin tran

    update table set a=1;

    空白mit tran

    end Try

    begin catch

    rollback tran

    end catch

    2:可以使用error 全局变量

    begin tran

    update tablename set ad=1111

    if @@error<>0 begin rollback end

    空白mit tran

    注意:如果一个事务写了 begin trans ,后面一定要跟上 空白mit tran或 rollback transaction ,否则可能导致被锁

    什幺样的sql可以回滚,什幺样的又不可以?

    对于SQL语言,有两个组成部分:

    DML(data manipulation language) 有:SELECT、UPDATE、INSERT、DELETE

    DDL(data definition language)DDL比DML要多,主要的命令有CREATE、ALTER、DROP等

    DML 需要显式回滚

    DDl是隐式提交的 不能回滚

    sql server事务回滚代码怎幺写

    事务回滚有几种,下面只是常见的一种

    declare???@iErrorCount???int

    set?@iErrorCount?=?0

    begin?tran?Tran1

    insert?into?t1(Id,?c1)?values(1,'1')

    set?@iErrorCount=@iErrorCount+@@error

    insert?into?t1(Id,?c1)?values('XX2','2')

    set?@iErrorCount=@iErrorCount+@@error

    if?@iErrorCount=0

    begin

    COMMIT?TRAN?Tran1??--执行事务

    end

    else

    begin

    ROLLBACK?TRAN?Tran1??--回滚事务

    end

    SQL语言中,用于事务回滚的语句是什幺?

    rollback

    SQL数据库,能进行回滚操作幺?

    回滚操作时有前提的

    得开事物才行

    如果默认

    就自动空白mit了

    如果是工具操作的

    应该有回滚按钮

    展开全文
  • Springboot操作数据库 事务回滚

    千次阅读 2021-03-08 09:20:33
    sqlserver数据库   ...在service层中设置数据库回滚 通过@Transactional注解 @Service @Transactional public class UserServiceImpl implements UserService { @Autowired private U

    sqlserver数据库

           操作sqlserver数据库时,比如新增、更新操作。而当sqlserver出现错误或异常时,需要将已经执行的操作撤回。

    • 在service层中设置数据库的回滚
      通过@Transactional注解
    @Service
    @Transactional
    public class UserServiceImpl implements UserService {
    
    	@Autowired
    	private UserMapper userMapper;
    	
    	@Autowired
    	private RedisTemplate redisTemplate;
    	
    	@Override
    	@Transactional(rollbackFor = Exception.class)
    	public int addUser(User user) {
    		try {
    			// 添加user1
    			userMapper.addUser(user);
    			// 添加user2 重复添加相同数据,此时出现"主键重复"错误
    			userMapper.addUser(user);
    			
    		} catch (Exception e) {
    			//e.printStackTrace();
    			// 数据库回滚操作
    			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    			return 0;
    		}
    		// 添加成功后,将数据写入redis数据库
    		redisTemplate.opsForHash().put("userHash", user.getId(), user);
    		return 1;
    	}
    
    }
    

    当没有使用“TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();”执行回滚操作时,“添加user1”的语句已经执行,数据库中存在user1的数据。使用回滚操作后,因为“添加user2”出现异常,虽然“添加user1”执行成功,但user1没有写入数据库。

    • 启动类中需要添加注解@EnableTransactionManagement
    @SpringBootApplication
    @EnableTransactionManagement
    public class StartApplication {
    	public static void main(String[] args) throws Exception {
    		SpringApplication.run(StartApplication.class, args);
    	}
    }
    

    redis缓存

           当执行新增或修改操作出现异常时,sqlserver数据库没有操作成功,但redis数据库已经成功插入修改数据,此时需要回滚redis事务。

    Redis的基础事务及事务回滚

    	@Transactional(rollbackFor = Exception.class)
    	public int addUser(User user) {
    		// 开启事务权限
    		redisTemplate.setEnableTransactionSupport(true); 
    		try {
    			// 开启事务
    			redisTemplate.multi();
    			// 操作sqlserver数据库
    			userMapper.addUser(user);
    			// 操作redis数据库
    			redisTemplate.opsForHash().put("userHash", user.getId(),user);
    			// 抛出异常
    			int error = 1/0;
    			// redis事务执行
    			redisTemplate.exec();
    			return 1;
    		} catch (Exception e) {
    			e.printStackTrace();
    			// redis回滚事务
    			redisTemplate.discard();
    			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    			return 0;
    		}
    	}
    
    展开全文
  • 数据库事务回滚

    万次阅读 2017-09-05 20:24:36
    spring 事务回滚 1、遇到的问题  当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下: ? 1 2 3 4 5 6 7 public ...

    spring 事务回滚

    1、遇到的问题

      当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下:

    ?
    1
    2
    3
    4
    5
    6
    7
    public method() {
       Dao1.save(Person1);
       Dao1.save(Person2);
     
       Dao1.save(Person2); //假如这句发生了错误,前面的两个对象会被保存到数据库中
       Dao1.save(Person2);
    }

      期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存

      正常情况:前面的数据库操作会被执行,而发生数据库操作错误开始及之后的所有的数据保存操作都将失败。这样子应该都不是我们要的结果吧。

      当遇到这种情况,我们就可以使用Spring的事务解决这个问题。

    2、异常的一些基本知识

    1) 异常的架构

      异常的继承结构:Throwable为基类,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception。Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。

    2)Error异常

      Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误。Error是一种unchecked Exception,编译器不会检查Error是否被处理,在程序中不用捕获Error类型的异常。一般情况下,在程序中也不应该抛出Error类型的异常。

    3)RuntimeException异常

      Exception异常包括RuntimeException异常和其他非RuntimeException的异常。
      RuntimeException 是一种Unchecked Exception,即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获RuntimException类型的异常,也不必在方法体声明抛出 RuntimeException类。RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。

    4)Checked Exception异常

      Checked Exception异常,这也是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是checked Exception,上图中的IOException和ClassNotFoundException。JAVA 语言规定必须对checked Exception作处理,编译器会对此作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,不然不能通过编译。

    3、实例

      这里使用的事务配置如下:

    ?
    1
    2
    3
    4
    5
    6
    7
    <!-- Jpa 事务配置 -->
      <bean id= "transactionManager" class = "org.springframework.orm.jpa.JpaTransactionManager" >
        <property name= "entityManagerFactory" ref= "entityManagerFactory" />
      </bean>
      
      <!-- 开启注解事务 -->
      <tx:annotation-driven transaction-manager= "transactionManager" proxy-target- class = "true" />

      在spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例
    比如配置文件里有这么条记录

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <bean id= "dataSource" class = "com.alibaba.druid.pool.DruidDataSource" >
     
    <property name= "xxx" value= "xxx" />
     
    <property name= "xxx" value= "xxx" />
     
      ....
      <property name= "defaultAutoCommit" value= "true" />
     
    </bean>

      可能你会发现你并没有配置这个参数,是不是他就不会自动提交呢?答案是不是的,我这里是使用了com.alibaba.druid.pool.DruidDataSource作为数据库连接池,默认的defaultAutoCommit就是true,可以看下面的源码

     

      那么现在有两个情况
      情况1:如果没有在程序中手动捕获异常

    ?
    1
    2
    3
    4
    5
    @Transactional (rollbackOn = { Exception. class })
    public void test() throws Exception {
        doDbStuff1();
        doDbStuff2(); //假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作  会回滚。
    }

      情况2:如果在程序中自己捕获了异常

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Transactional (rollbackOn = { Exception. class })
    public void test() {
        try {
         doDbStuff1();
         doDbStuff2(); //假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作 不会回滚。
        } catch (Exception e) {
           e.printStackTrace();  
        }
    }

      现在如果我们需要手动捕获异常,并且也希望抛异常的时候能回滚肿么办呢?
      下面这样写就好了,手动回滚事务:

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Transactional (rollbackOn = { Exception. class })
    public void test() {
        try {
         doDbStuff1();
         doDbStuff2();
        } catch (Exception e) {
          e.printStackTrace();  
          TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); //就是这一句了,加上之后,如果doDbStuff2()抛了异常,                                            //doDbStuff1()是会回滚的
        }
    }
    展开全文
  • 这里在本地插入的时候我使用的是事务回滚机制,但是在调用其他平台接口的时候,只能通过调用新增和删除的接口进行“人工”的回滚;如果有大佬有更好的方法,欢迎在评论区留言;插入数据的时候需要调用X的新增接口,...
  • 数据库事务事务回滚

    千次阅读 2022-05-01 10:28:13
    6.什么是事务回滚? 7.如何进行事务回滚 1.什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个...
  • Spring 手动抛异常并让数据库事务回滚 try { throw new Exception("test exception!"); } catch ( Exception e ) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus()....
  • 执行多条SQL语句对数据库进行操作,如果某个SQL语句执行中出错,那么要对之前的操作进行回滚,代码比较简单。
  • 事务是一个整体, 由一条或者多条SQL语句组成, 这些SQL语句要么都执行成功, 要么就失败, 只要有一条SQL出现异常, 整个操作就会回滚 回滚:就是如果没有操作成功,所有的sql就会倒序重新把数据恢复到原来得样子,这样...
  • Java后端之数据库操作事务回滚

    千次阅读 2020-10-12 19:06:33
    事物是应用程序中一系列操作,事物完成是指所有的操作都完成,事物不完成是指一个操作也不能完成,事物结束有两种情况,当事务中的所有步骤全部完成时,事务提交,如果一个步骤失败,则发生回滚操作,撤销之前所有的...
  • mysql事务回滚机制与原理解析
  • RPC下,跨服务夸库能实现数据库事务回滚吗?若是能,怎么做? 跨服务修改数据后,该怎么回滚数据呢?是否有好的方案?
  • 主要是在实际开发中运用到对数据库的操作同步进行,几个操作相关性的问题。 回滚了就说明事务有个判断,阻止SQL的自动提交,添加认为控制
  • 数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作。Django的ORM在事务方面也提供了不少的API。有事务出错的整体回滚操作,也有基于保存点的部分回滚。本文将讨论...
  • java 应用程序操作数据库实例,若出现sql异常则事务回滚
  • 数据库 事务提交和回滚

    千次阅读 2019-02-21 12:17:46
    事务 - (transaction / tx)原子性操作性(不可以分割的操作) - 要么全做, 要么全不做事务的特点 - ACID 特性A - atomicity 原子性 : 不可分割, 要么成功要么全失败C - Consistency 一致性: 事务前后数据状态要保持...
  • MySQL事务回滚

    千次阅读 2022-02-25 10:17:17
    -- 创建一个数据库表 create table account( id int PRIMARY KEY auto_increment, `name` VARCHAR(10), balance DOUBLE ) -- 添加数据 insert into account values(null,'张三',1000),(null,'李四',1110); -- ...
  • 数据库事务实现原理

    千次阅读 2021-02-02 03:58:33
    通过本文你将了解:概述分类ACID事务实现原理事务隔离级别事务控制语句隐式提交使用建议01 概述事务一般是指数据库事务,简称事务,是一组不可分割的操作。事务会把数据库从一种一致状态转换为另一种一致状态。在...
  • ThinkPHP的事务回滚示例如下: $m=D('YourModel');//或者是M(); $m2=D('YouModel2'); $m->startTrans();//在第一个模型里启用就可以了,或者第二个也行 $result=$m->where('删除条件')->delete(); $result2=m2->...
  • MySQL--事务回滚机制与原理

    千次阅读 2021-03-18 19:33:48
    事务回滚机制 其实,讨论MySQL的事务回滚机制,也就是在说MySQL的事务原子性是如何实现的(关于事务之前文章中有过简单介绍)。所谓原子性,就是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不...
  • Java Spring 事务回滚详解

    千次阅读 2021-02-25 18:17:08
    这篇文章主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下spring 事务回滚1、遇到的问题当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下:public method() {...
  • java 事务 回滚

    2021-10-18 09:02:56
    给java后台方法添加事务回滚注解,在方法进行多表的增删改查的时候,如果失败可以对此方法前面的一些更新数据库表的语句进行撤销(回滚) 注解:@Transactional(rollbackFor = Exception.class) 回滚语句:...
  • 批量导入Excel数据到数据库,.NET开发,带数据校验、事务回滚、Excel预览、日志功能的完整开发实例
  • java数据库(mysql)事务回滚

    千次阅读 2019-05-29 19:01:07
    //事务回滚,无参数情况下,默认回滚到事务开始之前的状态 //有参数情况下,会回滚到指定位置 conn.rollback(savePoint); conn.commit(); } catch (SQLException e1) { e1.printStackTrace(); } }finally{ ...
  • 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。要同时修改数据库中两个不同表时,如果它们不是一个事务的话...
  • Spring事务回滚的两种方法

    千次阅读 2022-06-12 17:31:41
    可以使用 来设定针对特定的异常进行事务回滚,如果不设置则默认会回滚 RuntimeException and Error (参考自源码内文档)。 通过注入 来手动开启事务,手动回滚事务,用于抛出异常被catch后,进行手动回滚。...
  • 所以我们需要当插入数据的过程中发生日常时,就需要把插入的数据全部恢复完之前没有,回滚到上一层controller层,或者在service层抛出异常,并回滚数据库事务。 事务管理对于企业应用来说是至关重要的,即使出现异常...
  • 如前端完成一个操作,后台需要对数据库三张表进行操作,如若任意一个操作事务,这几个操作都应该不允许被实现,即回到操作前,解决方法是开启事务,让其在出错时实现事务回滚作用。 如:有以下三个业务操作需要三个...
  • 浅谈Spring中的事务回滚 事务控制有三种: 1、编程式事务:直接在代码中手动开启事务,手动提交,手动回滚。优点灵活,缺点繁琐,重复。 2、声明式事务:使用SpringAop配置事务。简化了编码,但是切入点要准确。 3、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 261,704
精华内容 104,681
关键字:

数据库事务回滚