zoukankan      html  css  js  c++  java
  • JDBC处理Transaction

     1 package com.ayang.jdbc;
     2 
     3 import java.sql.*;
     4 /**
     5  * transaction的构成,随便写一句insenrt,一执行executeUpdate(),它自动提交。
     6  * 下边例子有三条update语句,假设第一条是updateA账户上的钱完了,自动提交,这时候出错了,B账户上的钱没update,这时候会出现数据不一致的问题。
     7  * 解决办法很简单,把它放在一个transtraction里去,要么两条同时完成,要么都不完成。
     8  * 任何一条DML语句会自动提交,因为在整个数据库连接里,有一个属性:AutoCommit();默认为值true,会自动提交。要想把某些语句放在一个transaction里,
     9  * 把AutoCommit(false);设为false,手动提交:最后执行conn.commit();然后恢复AutoCommit()为true.
    10  * 如果catch到任何SQLException,首先进行conn.rollback();然后conn.setAutoCommit(true);确保万无一失。
    11  */
    12 
    13 
    14 public class TestTransaction {
    15 
    16     public static void main(String[] args) {
    17             Connection  conn  = null;
    18             Statement  stmt =  null;
    19             try {
    20                 Class.forName("oracle.jdbc.driver.OracleDriver");
    21                 conn  =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","root");
    22                 
    23                 conn.setAutoCommit(false);
    24                 stmt = conn.createStatement();
    25                 stmt.addBatch("insert into dept2 values(60,'CPU','XUCHANG')");
    26                 stmt.addBatch("insert into dept2 values(61,'CPU','XUCHANG')");
    27                 stmt.addBatch("insert into dept2 values(62,'CPU','XUCHANG')");
    28                 stmt.executeBatch();
    29                 conn.commit();
    30                 conn.setAutoCommit(true);
    31             
    32                 
    33             } catch (ClassNotFoundException e) {
    34                 e.printStackTrace();
    35             } catch (SQLException e) {
    36                 e.printStackTrace();
    37                 
    38                 try {
    39                     if(conn != null){
    40                         conn.rollback();     //有异常时回滚。
    41                         conn.setAutoCommit(true);
    42                     
    43                     }    
    44                 }catch (SQLException e1) {
    45                     e1.printStackTrace();
    46                 }finally{
    47                     try{
    48                         if(conn!=null){
    49                             conn.close();
    50                         }if(stmt!=null){
    51                             stmt.close();
    52                         }
    53                     }catch (SQLException e1) {
    54                         e1.printStackTrace();
    55                     }
    56                 }
    57             }
    58             
    59         
    60 
    61     }
    62 
    63 }

    自动提交效果对比,能插入前两条记录(第三条sql语句缺失into)第三条sql不会执行。

     

    //conn.setAutoCommit(false);

    stmt = conn.createStatement();

    stmt.addBatch("insert into dept2 values(60,'CPU','XUCHANG')");

    stmt.addBatch("insert into dept2 values(61,'CPU','XUCHANG')");

    stmt.addBatch("insert  dept2 values(62,'CPU','XUCHANG')");

    stmt.executeBatch();

            conn.commit();

        //conn.setAutoCommit(true);


     

  • 相关阅读:
    Pytorch使用tensorboardX实现loss曲线可视化。超详细!!!
    numpy安装失败:numpy和cv2的版本不一样吧 pip安装/卸载
    问题解决:RuntimeError: CUDA out of memory.(....; 5.83 GiB reserved in total by PyTorch)
    前端刷题网站
    vscode如何使用ssh连接远程linux
    marginnote使用
    前端知识点
    HTTP状态码
    内置对象总结
    微信小程序
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4473973.html
Copyright © 2011-2022 走看看