87.【事务】

事务

概念:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。

操作

  1. 开启事务
  2. 提交事务
  3. 回滚事务

使用Connection对象来管理事务

开启事务

  • 调用该方法设置参数为false,即开启事务
  • 在执行sql之前开启事务
setAutoCommit(boolean autoCommit);

代码实现:

//开启事务
conn.setAutoCommit(false);

提交事务

commit() 

代码实现:

//提交事务
conn.commit();

回滚事务

  • 在catch中回滚事务
rollback() 

代码实现:

if (conn != null) { // 避免conn空指针异常
    try {
        conn.rollback();
    } catch (SQLException ex) {
        ex.printStackTrace();
}

流程演示

package cn.luis.demo4.Commit;

import cn.luis.demo3.util.JDBCUtils;

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

/**
 * @ClassName JDBCDemo1
 * @Description 定义一个方法
 * @Author L
 * @Date 2020.01.18 10:34
 * @Version 1.0
 * @Remark 事务操作
 **/
public class JDBCDemo1 {

    public static void main(String[] args) {
        new JDBCDemo1().update();
    }

    /**
     * @Author Lius
     * @Description 练习 登录方法,事务操作 数据库是:db3 account
     * @Date 10:36 2020.01.18
     * @Param []
     * @Return java.util.List<cn.luis.demo2.domain.Emp>
     **/
    public void update() {
        Connection conn = null;
        PreparedStatement pstmt1 = null;
        PreparedStatement pstmt2 = null;

        try {
            //1.获取连接
            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);
            //5.执行sql
            pstmt1.executeUpdate();
            // 手动制造异常
//            int i = 3 / 0;

            pstmt2.executeUpdate();
            //提交事务
            conn.commit();
        } catch (SQLException e) {
            //事务回滚
            try {
                if (conn != null) { // 避免conn空指针异常
                    try {
                        conn.rollback();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }
                e.printStackTrace();
            } finally {
                JDBCUtils.close(pstmt1, conn);
                JDBCUtils.close(pstmt1, null);
            }
        }
    }
}
发布了36 篇原创文章 · 获赞 14 · 访问量 3586

猜你喜欢

转载自blog.csdn.net/qq_39720594/article/details/105222283