zoukankan      html  css  js  c++  java
  • JDBC事务

    数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
    事务特性 ACID
    1)原子性(atomicity):事务必须是原子工作单元;对其数据修改,要么全都执行,要么全都不执行【最小的工作单位】
    2)一致性(consistency):事务在完成时,必须使所有的数据都保持一致状态【同时成功或者同时失败】
    3)隔离性(isolation):由并发事务所作的修改必须与任何其他并发事务所作的修改隔离【事务与事务之间相互不影响】
    4)持久性(durability):事务完成之后,它对于系统的影响是永久性的【事务一旦提交不可回滚】

    核心代码:将JDBC自动提交关闭,改成手动提交,然后在让出错的事务在异常里捕获成回滚。这样保证了提交事务出错数据不改动。从而达到数据的正确性。

    // JDBC自动提交关闭,改成手动提交
    connection.setAutoCommit(false);
    // 手动提交
    connection.commit();
    // 如果事务出错,就让他它回滚
    connection.rollback();
    

    详细代码测试:

     1 package boom;
     2 
     3 import java.sql.Connection;
     4 import java.sql.DriverManager;
     5 import java.sql.PreparedStatement;
     6 import java.sql.ResultSet;
     7 import java.sql.SQLException;
     8 
     9 /**
    10  * 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
    11  * 原子性:最小的工作单位
    12  * 一致性:同时成功或者同时失败
    13  * 隔离性:事务与事务之间相互不影响
    14  * 持久性:事务一旦提交不可回滚
    15  * @author Administrator
    16  *
    17  */
    18 public class JDBC_test06 {
    19     public static void main(String[] args) {
    20         // 声明参数
    21         String driver = "oracle.jdbc.driver.OracleDriver";
    22         String url = "jdbc:oracle:thin:@localhost:1521:XE";
    23         String username = "scott";
    24         String userpwd = "tiger"; 
    25         
    26         // 声明连接
    27         Connection connection = null;
    28         PreparedStatement ps  = null;
    29         ResultSet resultSet = null;
    30         
    31         try {
    32             //1.加载驱动
    33             Class.forName(driver);
    34             //2.创建连接
    35             connection = DriverManager.getConnection(url, username, userpwd);
    36             
    37             // JDBC自动提交关闭,改成手动提交
    38             connection.setAutoCommit(false);
    39             //3.发送SQL语句
    40             String update01 = "update comm set sal=sal+1000 where id=1";
    41             String update02 = "update comm set saddl=sal-1000 where id=2";
    42             //4.获取资源
    43             ps = connection.prepareStatement(update01);
    44             int n1 = ps.executeUpdate();
    45             //5.处理结果
    46             if(n1>0){
    47                 System.out.println("JDBC_test06.main(测试成功01)");
    48             }
    49             ps = connection.prepareStatement(update02);
    50             int n2 = ps.executeUpdate();
    51             if(n2>0){
    52                 System.out.println("JDBC_test06.main(测试成功02)");
    53             }
    54             // 手动提交
    55             connection.commit();
    56             
    57         } catch (ClassNotFoundException | SQLException e) {
    58             try {
    59                 // 如果事务出错,就让他它回滚
    60                 connection.rollback();
    61             } catch (SQLException e1) {
    62                 // TODO Auto-generated catch block
    63                 e1.printStackTrace();
    64             }
    65             e.printStackTrace();
    66         }finally {
    67             try {
    68                 if(ps!=null)
    69                 ps.close();
    70             } catch (SQLException e) {
    71                 e.printStackTrace();
    72             }
    73             try {
    74                 if(connection!=null)
    75                     connection.close();
    76             } catch (SQLException e) {
    77                 e.printStackTrace();
    78             }
    79         }
    80     }
    81 } 
    View Code

    故意写错第二条SQL语句,但是第一条SQL语句还是可以正常执行。但因为在异常里捕捉了回滚事务。所以数据并无变化

  • 相关阅读:
    eslint 屏蔽html的检查
    css 自定义悬浮窗写法
    echarts象形图图例显示问题
    win10上rocketMQ的部署过程
    死锁以及如何避免死锁
    volatile的一个例子-通俗易懂
    Java四种引用类型
    记录下:安全|API接口安全性设计(防篡改和重复调用)
    了解聚集索引,非聚集索引,联合索引,索引覆盖
    mybatis 查询树形结构
  • 原文地址:https://www.cnblogs.com/cao-yin/p/9775110.html
Copyright © 2011-2022 走看看