精华内容
下载资源
问答
  • 数据库回滚机制(RollBack)的实现

    万次阅读 2016-11-28 20:45:47
    一、我们来看一个DML语句的处理过程描述 update undotest set object_type='VIEW' where object_type='PROCEDURE'; 检查shared pool中是否存在相同的语句,如果存在,重用执行计划,执行扫描运算,如果不...
    一、我们来看一个DML语句的处理过程描述
    update undotest set object_type='VIEW' where object_type='PROCEDURE';
    1. 检查shared pool中是否存在相同的语句,如果存在,重用执行计划,执行扫描运算,如果不存在,执行硬解析生成执行计划
    2. 根据执行计划中的扫描运算,检查undotest表中的相关数据块是否存在buffer cache中,如果不存在则读取到内存中
    3. 检查数据块中符合object_type='PROCEDURE'条件的记录,如果没有符合条件的行记录,则结束语句,如果存在则进入下一步
    4. 以当前模式(current)获取符合object_type='PROCEDURE'条件的数据块,准备进行更新
    5. 在回滚表空间的相应回滚段头的事务表上分配事务槽,这个动作需要记录redo日志
    6. 从回滚段数据块上创建object_type='PROCEDURE'的前映像数据,这个动作也要记录redo日志
    7. 修改object_type='VIEW' ,这是DML操作的数据变更,而需要记录redo日志
    8. 用户提交时,在redo日志中记录提交信息,将回滚段头上的事务表和回滚段数据块标记为非活动,清除修改数据块上的事务信息(也可能延迟清除)。同时必须确保整个事务的redp日志写到磁盘上的日志文件
    注意:如果最后用户回滚了事务,oracle从回滚段中将前映像数据提取出来,覆盖被更新的数据块。这个回滚动作本身也需要产生redo日志,因此,我们要知道回滚的代价非常昂贵。
     
    二、不同的DML操作,UNDO BLOCK中保存的前映像内容
    • INSERT操作,UNDO中只需要保存插入记录的rowid,如果需要回退,通过保存的rowid进行删除即可(后面有案例)
    • UPDATE操作,UNDO中只需要记录被更新字段的旧值,如果需要回退,只需要通过旧值覆盖更新后的值即可。
    • DELETE操作,UNDO中必须记录整行的数据,如果需要回退,只需要将这整行的数据重新插入至表中即可。
    备注:本文章只对INSERT操作,UNDO中保存的内容进行测试,至于UPDATE、DELETE操作,实验方法基本一致,这里就不再累赘
    示例
    1.开启事务
    SQL> create table tt as select object_name,object_id from dba_objects;
    Table created.
    SQL> insert into tt values('dddddd',1233456); --执行insert操作
    1 row created.
    2.检查事务信息和其他一些事务信息
    SQL> select HEADER_FILE,HEADER_BLOCK from dba_segments a where segment_name='TT';
    HEADER_FILE HEADER_BLOCK
    ----------- ------------
    4 810
    SQL> SELECT
    2 dbms_rowid.rowid_object(rowid) object_id,
    3 dbms_rowid.rowid_relative_fno(rowid) REL_FNO,
    4 dbms_rowid.rowid_block_number(rowid) BLOCKNO,
    5 dbms_rowid.rowid_row_number(rowid) ROWNO,rowid,object_name
    6 FROM tt WHERE object_name='dddddd';
    OBJECT_ID REL_FNO BLOCKNO ROWNO ROWID
    ---------- ---------- ---------- ---------- ------------------
    OBJECT_NAME
    --------------------------------------------------------------------------------
    73430 4 1150 0 AAAR7WAAEAAAAR+AAA
    dddddd
    SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec,to_char(start_scnw,'xxxxxxxx') start_scnw, 
    2 to_char(start_scnb,'xxxxxxxx') start_scnb, start_scnb+start_scnw*power(2,32) start_scn 
    3 from v$transaction;
    XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC START_SCNW START_SCNB START_SCN
    ---------- ---------- ---------- ---------- ---------- ---------- -------------------- -------------------- ----------
    5 21 960 1466 3 7 0 f5520 1004832
    根据上面查询获取的事务信息,dump insert事务undo 段头和undo 块
    SQL> select name from v$rollname where usn=5;
    NAME
    ------------------------------
    _SYSSMU5_1527469038$
    3.dump undo 段头和undo 块
    SQL> oradebug setmypid;
    Statement processed.
    SQL> oradebug tracefile_name
    /u01/oracle/diag/rdbms/test/test/trace/test_ora_604.trc
    SQL> alter system dump undo header '_SYSSMU5_1527469038$';
    System altered.
    SQL> alter system dump datafile 3 block 1466;
    System altered.
    UNDO BLK: 
    xid: 0x0005.015.000003c0 seq: 0x12c cnt: 0x7 irb: 0x7 icl: 0x0 flg: 0x0000

    Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset
    ---------------------------------------------------------------------------
    0x01 0x1fa4 0x02 0x1f48 0x03 0x1ecc 0x04 0x1e70 0x05 0x1df4 
    0x06 0x1d90 0x07 0x1d20 
    *-----------------------------
    * Rec #0x7 slt: 0x15 objn: 73430(0x00011ed6) objd: 73430 tblspc: 4(0x00000004)
    * Layer: 11 (Row) opc: 1 rci 0x00 
    Undo type: Regular undo Begin trans Last buffer split: No 
    Temp ObjectNo 
    Tablespace Undo: No 
    rdba: 0x00000000Ext idx: 0
    flg2: 0
    *-----------------------------
    uba: 0x00c005b9.012c.2d ctl max scn: 0x0000.000f4ed4 prv tx scn: 0x0000.000f4ee0
    txn start scn: scn: 0x0000.000f53a9 logon user85
    prev brb: 12584373 prev bcl: 0
    KDO undo record:
    KTB Redo 
    op: 0x03 ver: 0x01 
    compat bit4 (post-11) padding: 1
    op: Z
    KDO Op code: DRP row dependencies Disabled --DRP操作完成回滚
    xtype: XA flags: 0x00000000 bdba: 0x0100047e hdba: 0x0100032a --bdba表示block address hdba 代表sgment header address
    itli: 1 ispac: 0 maxfr: 4858
    tabn: 0 slot: 0(0x0) ---------这个slot表示这一行数据在数据块中的行地址(行序列)
    其中bdba表示file 4,block 1150 ,hdba表示file 4,block 810 与我们上面查询出来的地址相符。
    我们可以看到,undo块中并没有直接保存rowid信息,但是oracle完全可以根据上面的几个信息(bdba,slot,objd)定位回滚时需要删除的具体数据,因此对于Insert操作,ORACLE只需保留上述信息,即可完成回滚操作
     
    三、基本概念和名词解释
    • UBA: Undo block address
    • RBA: Redo block address
    • Dba: Data block address
    • Rdba: Root dba
    • Xid: Transaction ID
    • ITL: Interested Transaction List 保存在数据块的头部(事务信息部分),包含XID,UBA,LCK,FLG等重要信息
    Transaction Identifiers
    Transaction identifiers (XID) uniquely identify a transaction within the system; they are used within the Interested Transaction List (ITL) of the data block.
    A transaction identifier consists of:
    • Undo segment number 即v$rollname中的usn
    • Transaction table slot number 对应回滚段头中回滚事务表的第几条记录
    • Sequence number or wrap#
    XID = usn# . slot# . wrap#
    Undo Block Address
    The undo block address (UBA) uniquely identifies the undo block for a given transaction; it is found within the ITL of the data block.
    A UBA consists of:
    • Data block address (DBA) of the block 前映像undo 块地址
    • The sequence number of the block 序列号
    • The record number within the block undo记录的开始地址(针对该块)
    UBA = DBA. seq#. rec#
    展开全文
  • Spring事务管理之回滚异常rollback-for

    千次阅读 2018-06-27 14:17:26
    一、业务背景业务需求:服务层调用多个dao方法,要求只要有一条数据库执行语句出错,则全部回滚。而实际情况是前面四条执行成功,第五条失败,结果只是抛出异常提示,前面四条还是成功执行。二、出错原因异常分为...

    一、业务背景

    业务需求:服务层调用多个dao方法,要求只要有一条数据库执行语句出错,则全部回滚。而实际情况是前面四条执行成功,第五条失败,结果只是抛出异常提示,前面四条还是成功执行。

    二、出错原因

    异常分为checked Exception 捕获异常 跟 unchecked Exception 未捕获异常,Spring默认发生未捕获异常时自动回滚,如发生RuntimeException。项目中都有针对调用dao层方法做try-catch处理,即已经对异常做出捕获处理,不满足Spring默认自动回滚情况,所以才会出现上面所述情况。

    三、解决方案(两种)

    如果想要不管有没有捕获异常做处理,只要其中一条发生异常,则全部回滚,那么可以采用下面两种配置方法:

    1、xml文件中进行显示配置

            <!-- 事务配置 -->
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 增加事务回滚切面扫描配置,不加的话有捕获异常就不回滚 -->
    <aop:config>
    <aop:pointcut id="serviceOperation" expression="execution(* com.abc.service..*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/>
    </aop:config>

    <!--事务管理,ServiceException事务回滚-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="get*" read-only="true" />
    <tx:method name="query*" read-only="true" />
    <tx:method name="find*" read-only="true" />
    <tx:method name="load*" read-only="true" />
    <tx:method name="select*" read-only="true" />
    <tx:method name="*" rollback-for="Exception" />
    </tx:attributes>
    </tx:advice>

    其中execution(* com.abc.service..*.*(..))表示:service包和所有子包里的任意类的任意方法。当然数据源记得配置,注解驱动及service类上加@Transactional可有可无。

    2、采用注解@Transactional

    配置@Transactional注解的rollbackFor属性,即在每个需要回滚的service类上加@Transactional(rollbackFor = Exception.class),代替xml的切面配置及事务管理


    展开全文
  • 不要认为只会用JDBC调用,会写SQL语句,就代表对数据库非常熟悉的。在世纪的情况中,很多通知对...2.SET_AUTOCOMMIT,ROLLBACK,COMMIT这3个方法是自定义的,每一个方法中包含对数据库的相应操作的SQL语句。 */ ...
    不要认为只会用JDBC调用,会写SQL语句,就代表对数据库非常熟悉的。在世纪的情况中,很多通知对数据库的某些方法不熟悉而走了许多弯路,比如不熟悉数据库的回滚函数,有人可能会自己写一个回滚。
    /*
    注意:
    1.一下程序需要数据库支持数据回滚。
    2.SET_AUTOCOMMIT,ROLLBACK,COMMIT这3个方法是自定义的,每一个方法中包含对数据库的相应操作的SQL语句。
    */

    dbc.SET_AUTOCOMMIT(0);//设置为人工提交
    int ret1=dbc.Update("insert into table1...");
    if(ret1<=0){
    ...
    ret1=dbc.Update("insert into table2 ......");
    if(ret1<=0){
    ……
    ret1=dbc.Update("insert into table3 ……");
    if(ret1<=0){
    ……
    ret1=dbc.Update("insert into table4 ……");

    }else{
    dbc.Rollback();//数据回滚
    }

    }else{
    dbc.Rollback();//数据回滚
    }

    dbc.commit();//数据提交
    }
    dbc.set_autocommit(1);//回复成自动
    展开全文
  • connection对象默认处于自动提交,意味着它执行每个语句后自动提交更改,即setAutoCommit(true),如果想同时执行多条语句需要将自动提交关闭setAutoCommit(false),当想要提交SQL语句的更改是调用commit()方法. ...

    查看jdk1.8_api:

    数据库连接connection对象的创建默认是设置自动提交事务的:

    connection对象默认处于自动提交,意味着它执行每个语句后自动提交更改,即setAutoCommit(true),如果想同时执行多条语句需要将自动提交关闭setAutoCommit(false),当想要提交SQL语句的更改是调用commit()方法.

     

     

    默认的setAutoCommit()方法:

     

    关闭自动提交后,想要提交时的需要调用的方法commit()

     当操作出现错误的时候回滚(回滚会撤销此前事务对数据的操作回到最初的状态):

     

    实例:

    package store.service.serviceImp;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import store.dao.OrderDao;
    import store.dao.daoImp.OrderDaoImp;
    import store.domain.OrderItem;
    import store.domain.Orders;
    import store.service.OrderService;
    import store.utils.JDBCUtils;
    
    public class OrderServiceImp implements OrderService{
    
    	@Override
    	public void save(Orders orders) throws SQLException {
    		// TODO 自动生成的方法存根
    		Connection cnn = null ;
    		try {
    			
    			//获取数据库连接
    			 cnn = JDBCUtils.getConnection();
    			//开启事务
    			 cnn.setAutoCommit(false);    //禁止每条语句自动提交
    			//保存订单
    			 OrderDao orderDao = new OrderDaoImp();
    			 orderDao.saveOrder(cnn,orders);
    			for (OrderItem orderItem : orders.getList()) {
    				orderDao.saveOrderItem(cnn,orderItem);
    				
    			}
    			 
    			//提交事务
    			cnn.commit();
    		} catch (Exception e) {
    			// TODO 自动生成的 catch 块
    			//回滚
    			cnn.rollback();
    			e.printStackTrace();
    		}
    		
    		
    	}
    
    }
    

     

     

    自动提交事务和手动提交事务:https://blog.csdn.net/qq_33824312/article/details/78346980

    展开全文
  • 数据库回滚与DDL、DML

    2018-03-31 23:38:00
    (begin,commit,rollback),则SQL语句中只能包括DML。 这样,自动化发布就会受限规范格式。 故而,一刀切的办法是,假定所有SQL不支持事务,自已定义好ROLLBACK的SQL脚本,在出错时能用代码回滚, 而不是依赖于...
  • 回滚 rollback

    2018-09-17 20:15:55
    回滚(rollback)就是在事务提交之前将数据库数据恢复到事务修改之前数据库数据状态。 例如,用户A给用户B转账,在数据库中就需要给A与B的账户信息进行修改(update)操作,而这两条sql语句必须都执行或者都不执行。 ...
  • ·执行COMMIT或ROLLBACK语句。 ·执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动热行COMMIT语句。 ·执行一条DCL语句,例按如GRANT语句;在这种情况下,会自动执行COMMIT语句。 ·断开与数据库
  • Mysql 不能回滚语句

    千次阅读 2014-03-19 09:58:30
    13.4.2. 不能回滚语句 ...如果您在事务的前部中发布了一个不能被回滚语句,则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。 缘起一段python脚本:
  • 直接在执行DML语句后进行提交即可,如果不提交事务则刚刚通过DML语句进行修改的内容还未保存到数据库中,只在当前用户的连接会话中有效。要永久变更数据需要显示地执行提交、回滚或者退出当前回话(如退出sqlplus)...
  • 数据库语句类型

    2007-12-03 09:31:00
    DDL数据库定义语句 不可以rollback DML数据库操作语句(增、删、改、查) 可以回滚DCL 数据库控制语句(GRANT 、REVOKE 、COMMIT 、ROLLBACK
  • 数据库之DML语句

    2020-03-23 11:02:13
    数据库之DML语句 DML语句数据库操作语句) 如果涉及到对表的数据...取消/回滚rollback; 插入数据 语法: insert into 表名(列1,列2,列3) values(值1,值2,值3); 如果对整个表的所有列都需要增加数据 insert in...
  • 为了方便描述,假设现在有一个表flow,包含字段pday、id、uv ...注意,DDL不涉及记录的修改,不需要commit命令(提交、确认、生效)且不能rollback回滚。 BEGIN TRANSACTION; --增加列 alter table flow
  • 87.Oracle数据库SQL开发之 修改表内存——数据库事务的提交和回滚 欢迎转载,转载请标明出处: 数据库事务...要取消SQL语句的结果,需要执行ROLLBACK语句,从而回滚事务,键给所有行重新设置为原始状态。 1
  • 数据库语句种类

    2012-09-16 13:54:20
    ddl ( 数据定义语句) create , alter , drop dml ( 数据操作语句) insert , delete , update select dtl ( 数据事务语句 ) commit , rollback , savepoint dcl ( 数据控制语句) ...rollback 事务回滚 gra
  • #事务:一组操作,要么全成功要么全失败1开启事务:strat transaction2回滚事务,即撤销指定sql语句(只有insert /delete /update):rollback3提交事务 提交未存储事务:commit保留点,事务处理中设置的点:...
  • 事务是由一组DML语句组成,完成一个相对完整的功能,这一组DML语句要么全部执行,要么全部...rollback 回滚事务,即撤销指定的sql语句(回退insert delete update语句) rollback to 保留点名称。 savepoint 保留...
  • SQL语句的分类 学习MYSQL主要学习SQL语句,包括增删改查,主要分为以下几类 ...4、TCL(事务控制语言):commit提交事务、 rollback回滚事务 5、DCL(数据控制语言):grant授权、revoke撤销权限等。 ...
  • 用过oracle或mysql的人都知道在sqlplus或mysql中,做一个dml语句,如果发现做错了,还可以rollback;掉,但在PostgreSQL的psql中,如果执行一个dml,没有先运行begin;的话,一执行完就马上提交了,不能回滚,这样容易...
  • 数据库

    2021-03-14 17:42:58
    事务在执行过程中发生错误,会被回滚Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的...
  • 数据库学习

    2021-03-09 16:24:53
    数据库学习MYSQL数据库三种删除方式使用...可以配合事件(transaction)和 回滚rollback)找回数据,且自增不会被重置 delete 既可以对table也可以对view 可以全部删除,也可以按条件删除 -- 删除表中全部数据 delet
  • oracle数据库执行sql语句报错(ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired) ...因为执行了对people2表的insert的sql语句,既没commit提交,也没rollback回滚 ...
  • 数据库事物

    2018-04-08 20:14:42
    数据库事物 1.事物处理顺序 事物的sql语句(用事务(事务开始和事物提交)SQL语句包裹主要...4.把事务回滚(rollback;) 遇到断电 事务没有提交 那么事务会自动回滚 例如: begin; update 表 set money=money-100 ...
  • 数据库事务初识

    2019-06-14 23:19:00
    事务概述 一件事情有n个组成单元组成,要不这n个组成单元同时成功,要不n个单元同时失效。 MySQL的事务 默认的事务:一条sql语句就是一个...事务的回滚rollback 代表事务的回滚,从开启事务到事务的回滚,中间...
  • 上次总结到数据库SQL语句的准备和执行,以及批处理操作。 事务 ...SQL操作失败,数据将回滚rollback)到SQL语句操作前的状态。 事务的四个特性: 1)原子性:即执行时要么全部成功,要么全
  • 回滚rollback;出现问题回滚到开启事务 提交:commit;数据没有问题就提交事务 在mysql数据库中事务默认自动提交 一条DML(增删改)语句会自动提交一次事务 事务提交的两种方式 1、自动提交 mysql是自动提交的 2.....
  • 数据库事务

    2019-10-11 10:46:38
    Mysql事务: 事务的概念: 对于用户而言,事务是具有完整逻辑意义的数据库操作序列的集合。对于数据库管理系统而言,事务是一个读写操作序列...2 事务回滚(rollback) : 终止当前事务,撤销其对数据库做的更新,并释...
  • DML语句(delete,insert,update)

    千次阅读 2016-10-03 01:32:52
    DML(Data Manipulation Language 数据操作语言)insert 将记录插入到数据库update 修改数据库的记录delete 删除数据库的记录commit 提交数据savepoint 设置回滚rollback 回滚执行DML命令如果没有提交,将不会被...
  • 数据库—事务

    2020-05-05 21:45:12
    数据库—事务: 事务的基本介绍 ...2. 回滚rollback 3. 提交:commit Mysql数据库中事务默认自动提交: 事务提交的两种方式: 自动提交: mysql就是自动提交的 *一条DML(增删改)语句会自动提交一...
  • 不能回滚的sql

    2019-08-14 13:56:50
    数据库中数句分DML,DDL,DCLDML是数据控制语句,包括SELECT,INSERT,UPDATE,DELETE,可以用ROLLBACK回滚操作或COMMIT提交操作DDL是数据定义语句,包括CREATE,DROP,ALTER,不可进行事务操作,不能回滚,也就是说...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 748
精华内容 299
关键字:

数据库回滚语句rollback