精华内容
下载资源
问答
  • 这篇文章主要介绍了Java的JDBC使用中设置事务回滚的保存点的方法,JDBC是Java用于连接各种数据库的API 当设置一个保存点在事务中定义一个逻辑回滚。如果发生错误,过去一个保存点,则可以使用rollback方法来...

    这篇文章主要介绍了在Java的JDBC使用中设置事务回滚的保存点的方法,JDBC是Java用于连接各种数据库的API

    当设置一个保存点在事务中定义一个逻辑回滚点。如果发生错误,过去一个保存点,则可以使用rollback方法来撤消要么所有的改变或仅保存点之后所做的更改。

    Connection对象有两个新的方法,可帮助管理保存点:

    setSavepoint(String savepointName): 定义了一个新的保存点。它也返回一个Savepoint 对象。

    releaseSavepoint(Savepoint savepointName): 删除一个保存点。请注意,它需要一个Savepoint 对象作为参数。这个对象通常是由setSavepoint()方法生成一个保存点。

    有一个rollback ( String savepointName ) 方法回滚工作到指定的保存点。

    下面的例子演示如何使用Savepoint对象:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    try{
      //Assume a valid connection object conn
      conn.setAutoCommit(false);
      Statement stmt = conn.createStatement();
       
      //set a Savepoint
      Savepoint savepoint1 = conn.setSavepoint("Savepoint1");
      String SQL = "INSERT INTO Employees " +
            "VALUES (106, 20, 'Rita', 'Tez')";
      stmt.executeUpdate(SQL);
      //Submit a malformed SQL statement that breaks
      String SQL = "INSERTED IN Employees " +
            "VALUES (107, 22, 'Sita', 'Tez')";
      stmt.executeUpdate(SQL);
      // If there is no error, commit the changes.
      conn.commit();
     
    }catch(SQLException se){
      // If there is any error.
      conn.rollback(savepoint1);
    }

    在这种情况下没有上述INSERT语句会成功,一切都将被回滚。
    下面是利用setSavepoint和事务教程描述回滚的例子。

    基于对环境和数据库安装在前面的章节中做此示例代码已经解释。

    复制下面的例子JDBCExample.java,编译并运行,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    //STEP 1. Import required packages
    import java.sql.*;
     
    public class JDBCExample {
      // JDBC driver name and database URL
      static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
      static final String DB_URL = "jdbc:mysql://localhost/EMP";
     
      // Database credentials
      static final String USER = "username";
      static final String PASS = "password";
       
    public static void main(String[] args) {
      Connection conn = null;
      Statement stmt = null;
      try{
       //STEP 2: Register JDBC driver
       Class.forName("com.mysql.jdbc.Driver");
     
       //STEP 3: Open a connection
       System.out.println("Connecting to database...");
       conn = DriverManager.getConnection(DB_URL,USER,PASS);
     
       //STEP 4: Set auto commit as false.
       conn.setAutoCommit(false);
     
       //STEP 5: Execute a query to delete statment with
       // required arguments for RS example.
       System.out.println("Creating statement...");
       stmt = conn.createStatement();
     
      //STEP 6: Now list all the available records.
       String sql = "SELECT id, first, last, age FROM Employees";
       ResultSet rs = stmt.executeQuery(sql);
       System.out.println("List result set for reference....");
       printRs(rs);
     
       // STEP 7: delete rows having ID grater than 104
       // But save point before doing so.
       Savepoint savepoint1 = conn.setSavepoint("ROWS_DELETED_1");
       System.out.println("Deleting row....");
       String SQL = "DELETE FROM Employees " +
              "WHERE ID = 110";
       stmt.executeUpdate(SQL);
       // oops... we deleted too wrong employees!
       //STEP 8: Rollback the changes afetr save point 2.
       conn.rollback(savepoint1);
     
      // STEP 9: delete rows having ID grater than 104
       // But save point before doing so.
       Savepoint savepoint2 = conn.setSavepoint("ROWS_DELETED_2");
       System.out.println("Deleting row....");
       SQL = "DELETE FROM Employees " +
              "WHERE ID = 95";
       stmt.executeUpdate(SQL);
     
      //STEP 10: Now list all the available records.
       sql = "SELECT id, first, last, age FROM Employees";
       rs = stmt.executeQuery(sql);
       System.out.println("List result set for reference....");
       printRs(rs);
     
       //STEP 10: Clean-up environment
       rs.close();
       stmt.close();
       conn.close();
      }catch(SQLException se){
       //Handle errors for JDBC
       se.printStackTrace();
       // If there is an error then rollback the changes.
       System.out.println("Rolling back data here....");
      try{
      if(conn!=null)
          conn.rollback();
       }catch(SQLException se2){
         se2.printStackTrace();
       }//end try
     
      }catch(Exception e){
       //Handle errors for Class.forName
       e.printStackTrace();
      }finally{
       //finally block used to close resources
       try{
         if(stmt!=null)
          stmt.close();
       }catch(SQLException se2){
       }// nothing we can do
       try{
         if(conn!=null)
          conn.close();
       }catch(SQLException se){
         se.printStackTrace();
       }//end finally try
      }//end try
      System.out.println("Goodbye!");
    }//end main
     
      public static void printRs(ResultSet rs) throws SQLException{
       //Ensure we start with first row
       rs.beforeFirst();
       while(rs.next()){
         //Retrieve by column name
         int id = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");
     
         //Display values
         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
       }
       System.out.println();
      }//end printRs()
    }//end JDBCExample

    现在让我们来编译上面的例子如下:

    1
    C:>javac JDBCExample.java

    当运行JDBCExample,它会产生以下结果:

    1
    C:>java JDBCExample
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Connecting to database...
    Creating statement...
    List result set for reference....
    ID: 95, Age: 20, First: Sima, Last: Chug
    ID: 100, Age: 18, First: Zara, Last: Ali
    ID: 101, Age: 25, First: Mahnaz, Last: Fatma
    ID: 102, Age: 30, First: Zaid, Last: Khan
    ID: 103, Age: 30, First: Sumit, Last: Mittal
    ID: 110, Age: 20, First: Sima, Last: Chug
     
    Deleting row....
    Deleting row....
    List result set for reference....
    ID: 100, Age: 18, First: Zara, Last: Ali
    ID: 101, Age: 25, First: Mahnaz, Last: Fatma
    ID: 102, Age: 30, First: Zaid, Last: Khan
    ID: 103, Age: 30, First: Sumit, Last: Mittal
    ID: 110, Age: 20, First: Sima, Last: Chug
     
    Goodbye!

    展开全文
  • 数据库事务设置保存点

    千次阅读 2015-05-18 20:58:29
    begin tran save transaction aapointdelete dbo.MIS_Group where ID=9rollback tran aapointselect * from dbo.MIS_Group
    begin tran 
    save transaction aapoint
    delete dbo.MIS_Group where ID=9
    rollback tran aapoint
    select * from dbo.MIS_Group
    展开全文
  • 关于设置事务回滚保存点设置

    千次阅读 2011-08-17 20:40:21
    下面用伪代码说明ingres数据库事务执行失败后全部回滚的实现过程 : ... //如果此处 保存点所依赖的transaction_handle事务句柄由connect()连接数据库时获取,则创建保存点成功,可以用rollbac

    下面用伪代码说明ingres数据库事务执行失败后全部回滚的实现过程 :

     

    try
    {
    
     savepoint(sp); //如果此处 保存点所依赖的transaction_handle事务句柄由connect()连接数据库时获取,则创建保存点成功,可以用rollback(sp)实现全部回滚;如果此时事务句柄为空,或者不是下面要执行事务的事务句柄,则此处savepoint(sp)创建保存点失败,要实现全部回滚必须用rollback(NULL);
    
      result=sql_query(A);//第一个查询语句A
    if(result==failure)
      throw 1;
      savepoint(sp1); //第一个保存点sp1
    
     result= sql_query(B);
    if(result==failure) throw 2;
      savepoint(sp2);
    
     result= sql_query(C);
    if(result==failure) throw 3;
    
    //提交事务
    commit();
    
    }
    catch(int i)
    {
      if(i==1)
    {//全部回滚
     rollback(NULL); //参数为空时就可以全部回滚 ,这是因为如果自动提交事务关闭之后,在commit之前的所有query语句都在一个事务中
    }
    else if(i==2)
    {
    //部分回滚
       rollback(sp1); //回滚到sp1
    }
    }
    

    展开全文
  • 一个事务中可以包含多个DML语句,一个DDL语句或者一个DCL语句。 事务中的语句要么全部执行,要么全部不执行。 事务具有四个特征(ACID) a.原子性。事务要么执行,要么全部不执行。 c.一致性。事务把数据库从一个...

    一.sqlserver 事务。

    一个事务中可以包含多个DML语句,一个DDL语句或者一个DCL语句。

    事务中的语句要么全部执行,要么全部不执行。

    事务具有四个特征(ACID)

    a.原子性。事务要么执行,要么全部不执行。

    c.一致性。事务把数据库从一个一致状态带入到另一个一致状态。

    i.独立性。一个事务的执行不受其他事务的影响。

    d.持续性。一个事务一旦提交就永久有效,不受关机等事件的影响。

    事务在如下情况终止:

    1.遇到rollback 或commit命令

    2.遇到DDL或者DCL语句.

    3.系统发生错误,崩溃或者退出。

    二.事务设置保存点,利用save transaction a 和rollback transaction a语句,

    如下

    begin transaction
    update test set hsmc = '木婉清' where recn = 19
    save transaction a
    delete from test where recn = 95
    save transaction b
    update test set hsmc = '段誉' where recn = 94
    save transaction c
    rollback transaction c
    commit


    --事务保存点以上的都将影响,当提交事务以后,只有保存点之前的语句被执行。

     

     










    本文转自鹅倌51CTO博客,原文链接:http://blog.51cto.com/kaixinbuliao/979833 ,如需转载请自行联系原作者





    展开全文
  • 事务中savepoint(保存点)的使用

    千次阅读 2019-03-02 08:21:00
    savepoint概念: 首先要知道savepoint就是为回退做的,savepoint的个数没有限制,savepoint和虚拟机快照类似. savepoint是事务中的一点。用于取消部分事务,当结束事务时,...设置保存点 savepoint a2.取消保存a...
  • MySQL事务保存点

    千次阅读 2021-01-09 20:18:20
    粗略来讲相当于Java的“断点”,设置一个断点,当你数据库插入一条数据后,这条语句后面设置一个savepoint,当你需要rollback的时候,只需要回滚到这个savepoint时就可以,这样就节省了大量的时间,提高的...
  • SQL server事务中保存点(save)

    千次阅读 2009-03-07 04:12:00
    保存提供了一种机制,用于回滚部分事务。更新和回滚操作代价很大,因此只有遇到错误的可能性很小,而且预先检查更新的有效性的代价相对很高的情况下,使用保存... 设置保存点的语法: SAVE TRANSACTION savePoint
  • 事务保存点

    千次阅读 2007-03-08 17:02:00
    保存点提供了一种机制,用于回滚部分事务。可以使用 SAVE TRANSACTION savepoint_name 语句创建一个保存点,然后再...很少出现错误的情况下使用保存点回滚部分事务,比让每个事务在更新之前测试更新的有效性更为有效
  • 一.为什么使用事务保存点 Mysql使用rollback会回滚所有的未提交事务状态...然而Mysql使用事务保存点即可很好的解决这个问题。 二.事务保存点的使用 savepoint 保存点名 --设置一个事务保存点 rollback to sa...
  • 事务 1事务由一系列的相关的sql语句组成的最小逻辑工作单元 2oracle以事务为单位来处理数据,保证数据的一致性 3如果对事务进行提交,该事物的所有sql语句操作都会提交,成为数据库的永久组成部分 4如果事务遇到...
  • 事务操作之savePoint保存点

    千次阅读 2018-03-07 08:27:47
    某转账业务有 A B C D 四个事务。 需求:AB(必须),CD(可选)。... //保存点,记录操作的当前位置,之后可以回滚到指定的位置。(可以回滚一部分) try{  //1 获得连接  conn = ...;  //2 开启事务  conn
  • SQL Server使用rollback会回滚所有的未提交事务状态,但是有些时候我们只需要回滚部分语句,把不需要回滚的语句提到事务外面来,虽然是个方法,但是却破坏了事务的ACID。其实我们可以使用SQL Server的...
  • 设置保存点的情况:一个事务中可以创建保存,根据具体情况就可以回退到某保存;但是如果一个事务被提交了,就不可以回退; 没有设置保存点的情况:如果没有设置保存点,也可以回滚,只能回滚到事务的开始。...
  • 我们可以mysql事务处理过程定义保存点(SAVEPOINT),然后回滚到指定的保存点前的状态。 定义保存点,以及回滚到指定保存点前状态的语法如下。 定义保存点---SAVEPOINT 保存点名;回滚到指定保存点---ROLLBACK ...
  • oracle事务 行级锁 保存点 回滚 提交

    千次阅读 2012-07-22 18:57:23
    事务会将所有在事务中被修改的数据行加上锁(行级锁),来阻止其它人(会话)同时对这些数据的修改操作。 当事务被提交或回滚后,这些数据才会被释放锁。 举个例子: 当A操作一条数据N1后,暂未提交事务 ,此时B...
  • 应用名/views.py(视图,事务): from django.shortcuts import render from django.http import HttpResponse from django.views.generic import View from django.db import transaction # 导入事务 # 类视图...
  • 事务提交、回滚、保存点

    千次阅读 2017-03-23 13:25:45
    * 事务四个特性: * 1.原子性 * 2.一致性 * 3.隔离性 * 4.持续性 * @author John * */ public class TransactionDemo { //事务的提交和回滚 @Test public void transaction1() throws SQLException{ ...
  • MYSQL可以让我们对事务进行部分回滚,就是在事务里调用SAVEPOINT语句来设置一些命名标记。如果想要回滚到那个标记位置,需要使用ROLLBACK语句来指定哪个保存点。 如下: mysql> truncate table d; Query OK, 0 ...
  • 手动开启事务/保存点/隐式发出commit的语句 1.手动开启事务 @Autowired DataSourceTransactionManager dataSourceTransactionManager; @Autowired TransactionDefinition transactionDefinition; ...
  • 事务是用来分割数据库活动的逻辑工作单元。...下列事件之一发生时,事务就结束了: 1.执行Commit或者RollBack语句 2.执行一条DDL语句,例如Create Table语句;这种情况下,会自动执行Commit语
  • 事务中的任何地方都可以设置一个保存点,这样可以将修改回滚到保存点处。如果有一个很大的事务,这将非常有用,因为这样如果在保存点后进行了误操作,并不需要将整个事务一直回滚到最开头。 执行如下: store@PDB1> ...
  • 事务中savepoint的使用

    千次阅读 2017-02-21 15:02:45
    保存点概念: ...保存点就是为回退做的。...保存点的个数没有限制 ,保存点和虚拟机...用于取消部分事务,当结束事务时,会自动的删除该事务中所定义的所有保存点。 当执行rollback时,通过指定保存点可以回退到指定
  • Oracle事务之savepoint

    万次阅读 2019-09-10 11:34:24
    保存savepoint是事务中的一点,通过rollback可以返回到某个保存。 一个事务中可以有多个保存。...1设置保存点 savepoint a 2取消部分事务 rollback to a 3取消全部事务 rollback 若执行SQL> co...
  • SQL SERVER实现事务的部分回滚

    千次阅读 2010-09-26 15:10:00
    SQL SERVER实现事务...BEGIN TRANSACTION Transaction_Name SQL_Statement1 SQL_Statement2 SAVE TRANSACTION Save_Name --设置保存点 SQL_Statement3 SQL_Statement4IF Test_Condition_Fails 
  • JDBC 如何进行事务处理? 答:Connection 提供了事务处理的方法,通过调用setAutoCommit(false)...除此之外,较新 的 JDBC 标准还引入了Savepoint(保存点)的概念,允许事务回滚到指定的保存点事务的 ACID 是指...
  • Spring事务及数据库事务的关系

    千次阅读 2019-06-13 17:23:24
    Spring事务及数据库事务的关系 一、MySQL事务 如果对MySQL事务不了解的话,请先看 基于MySQL 8.0 对事务的深度理解 二、Spring事务 Spring管理事务的方式 编程式事务 编程式事务就是利用手动...
  • <tx:advice/> 有关的设置 这一节里将描述通过 &... 标签来指定不同的事务设置。默认的 <tx:advice/> 设置如下:   事务传播设置是 REQUIRED 隔离级别是 DEFAU...
  • spring 事务控制 设置手动回滚

    千次阅读 2018-08-30 17:59:21
    在事务控制的service层类使用try catch 去捕获异常后,就会使事务控制失效,因为该类的异常并没有抛出,就不是触发事务管理机制。怎样才能即使用try catch去捕获异常,而又让出现异常后spring回滚呢,这里就要用到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 231,846
精华内容 92,738
关键字:

如何在事务中设置保存点