JDBC控制事务

1.事务:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
2.操作:
开启事务:start transaction;
回滚:rollback;
提交:commit;
3.使用Connection来管理事务
开启事务:void setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务。
提交事务:void commit()
回滚事务:void rollback()

package com.wcy.demo1.jdbc;

import JDBCUtils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * 事务操作
 */
public class JdbcDemo9 {


    public static void main(String[] args) {
        Connection conn=null;
        PreparedStatement pstmt1=null;
        PreparedStatement pstmt2=null;
        //1.获取连接
        try {
            conn = JDBCUtils.getConnection();
            //开启事务
            conn.setAutoCommit(false);


            //2.定义sql
            //2.1张三-500
            String sql1="update account set balance = balance - ? where id = ?";
            //2.2李四+500
            String sql2="update account set balance = balance + ? where id = ?";
            //3.获取执行sql对象
            pstmt1 = conn.prepareStatement(sql1);
            pstmt2 = conn.prepareStatement(sql2);
            //4.设置参数
            pstmt1.setDouble(1,500);
            pstmt1.setInt(2,1);

            pstmt2.setDouble(1,500);
            pstmt2.setInt(2,2);

            //提交事务
            conn.commit();
            //5.执行sql
            pstmt1.executeUpdate();
            //手动制造异常,主要看数据库发生变化了没有
            int i=3/0;
            pstmt2.executeUpdate();
        } catch (Exception e) {
            //事务回滚
            try {
                if (conn!=null) {
                    conn.rollback();
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            JDBCUtils.close(pstmt1,conn);
            JDBCUtils.close(pstmt2,null);
        }
    }
}

注意:
1.在执行sql之前开启事务
2.在所有sql都执行完提交事务
3.在catch中回滚事务

在Java中使用JDBC控制事务隔离级别,主要通过`Connection`对象的`setTransactionIsolation()`方法来实现。JDBC支持标准的SQL事务隔离级别,并且允许你在程序中动态设置事务的隔离级别。 --- ## 一、JDBC支持的事务隔离级别(对应`java.sql.Connection`接口) JDBC定义了以下五个常量表示事务隔离级别: | JDBC常量 | 说明 | |----------|------| | `Connection.TRANSACTION_NONE` | 不使用事务 | | `Connection.TRANSACTION_READ_UNCOMMITTED` | 读未提交 | | `Connection.TRANSACTION_READ_COMMITTED` | 读已提交 | | `Connection.TRANSACTION_REPEATABLE_READ` | 可重复读 | | `Connection.TRANSACTION_SERIALIZABLE` | 串行化 | --- ## 二、使用JDBC设置事务隔离级别的步骤 1. 获取数据库连接 2. 设置自动提交为`false` 3. 设置事务隔离级别 4. 执行SQL操作 5. 提交或回滚事务 --- ## 三、完整示例代码 以下是一个使用JDBC设置事务隔离级别的Java代码示例: ```java import java.sql.*; public class JdbcTransactionIsolationExample { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/testdb"; String user = "root"; String password = "password"; Connection conn = null; PreparedStatement pstmt = null; try { // 1. 获取数据库连接 conn = DriverManager.getConnection(url, user, password); // 2. 关闭自动提交,开启事务 conn.setAutoCommit(false); // 3. 设置事务隔离级别为 READ COMMITTED conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); // 4. 执行插入操作 String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, "Alice"); pstmt.setString(2, "alice@example.com"); pstmt.executeUpdate(); // 5. 提交事务 conn.commit(); System.out.println("数据插入成功"); } catch (SQLException e) { // 6. 异常处理并回滚 if (conn != null) { try { conn.rollback(); // 回滚事务 System.out.println("事务已回滚"); } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); } finally { // 7. 关闭资源 try { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` --- ## 四、代码解释 - `conn.setAutoCommit(false);`:关闭自动提交模式,开启手动事务。 - `conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);`:将事务隔离级别设置为“读已提交”。 - `conn.commit();`:提交事务。 - `conn.rollback();`:在发生异常时回滚事务,确保数据一致性。 - 使用`try-catch`块来捕获异常并处理回滚逻辑,保证程序的健壮性。 --- ## 五、注意事项 - 不同数据库对隔离级别的支持可能不同,例如: - MySQL支持所有级别。 - Oracle不支持`TRANSACTION_REPEATABLE_READ`,而是使用自己的多版本并发控制(MVCC)机制。 - 在生产环境中,应根据业务需求选择合适的隔离级别,在**一致性**和**并发性能**之间取得平衡。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值