JDBC事务处理

简介: JDBC事务处理

JDBC事务处理

  • 数据一旦提交,就不可回滚
  • 数据什么时候意味着提交?
  • 当一个连接对象被创建时,默认情况下是自动提交事务:每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚。
  • **关闭数据库连接,数据就会自动的提交。**如果多个操作,每个操作使用的是自己单独的连接,则无法保证事务。即同一个事务的多个操作必须在同一个连接下。
  • JDBC程序中为了让多个 SQL 语句作为一个事务执行:
  • 调用 Connection 对象的 setAutoCommit(false); 以取消自动提交事务
  • 在所有的 SQL 语句都成功执行后,调用 commit(); 方法提交事务
  • 在出现异常时,调用 rollback(); 方法回滚事务

若此时 Connection 没有被关闭,还可能被重复使用,则需要恢复其自动提交状态 setAutoCommit(true)。尤其是在使用数据库连接池技术时,执行close()方法前,建议恢复自动提交状态。

【案例:用户AA向用户BB转账100】

public void testJDBCTransaction() {
  Connection conn = null;
  try {
    // 1.获取数据库连接
    conn = JDBCUtils.getConnection();
    // 2.开启事务
    conn.setAutoCommit(false);
    // 3.进行数据库操作
    String sql1 = "update user_table set balance = balance - 100 where user = ?";
    update(conn, sql1, "AA");
    // 模拟网络异常
    //System.out.println(10 / 0);
    String sql2 = "update user_table set balance = balance + 100 where user = ?";
    update(conn, sql2, "BB");
    // 4.若没有异常,则提交事务
    conn.commit();
  } catch (Exception e) {
    e.printStackTrace();
    // 5.若有异常,则回滚事务
    try {
      conn.rollback();
    } catch (SQLException e1) {
      e1.printStackTrace();
    }
    } finally {
        try {
      //6.恢复每次DML操作的自动提交功能
      conn.setAutoCommit(true);
    } catch (SQLException e) {
      e.printStackTrace();
    }
        //7.关闭连接
    JDBCUtils.closeResource(conn, null, null); 
    }  
}

其中,对数据库操作的方法为:

//使用事务以后的通用的增删改操作(version 2.0)
public void update(Connection conn ,String sql, Object... args) {
  PreparedStatement ps = null;
  try {
    // 1.获取PreparedStatement的实例 (或:预编译sql语句)
    ps = conn.prepareStatement(sql);
    // 2.填充占位符
    for (int i = 0; i < args.length; i++) {
      ps.setObject(i + 1, args[i]);
    }
    // 3.执行sql语句
    ps.execute();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    // 4.关闭资源
    JDBCUtils.closeResource(null, ps);
  }
}


目录
相关文章
|
6月前
|
SQL Java 关系型数据库
JDBC技术【SQL注入、JDBC批量添加数据、JDBC事务处理、其他查询方式】(三)-全面详解(学习总结---从入门到深化)
JDBC技术【SQL注入、JDBC批量添加数据、JDBC事务处理、其他查询方式】(三)-全面详解(学习总结---从入门到深化)
74 0
|
Java 数据库连接
JDBC中如何进行事务处理?
Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;当事务完成后用commit()显式提交事务;如果在事务处理过程中发生异常则通过rollback()进行事务回滚。
1323 0
|
SQL Java 数据库连接
基于Spring JDBC的事务处理
基于Spring JDBC的事务处理
136 0
|
SQL Java 数据库连接
|
1月前
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
124 1
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
86 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
37 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
46 0
|
3月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
55 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)