java操作事务

一、回顾事务

​ 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行

要么都成功,要么都失败

ACID原则

原子性: 要么全部完成,要么都不完成
一致性: 总数不变.
隔离性: 多个进程互不干扰
持久性: 一旦提交不可逆,持久化到数据库了

隔离性的问题:
脏读: 一个事务读取了另一一个没有提交的事务
不可重复读: 在同一个事务内,重复读取表中的数据,表数据发生了改变
虚读(幻读) : 在一个事务内,读取到了别人插入的数据,导致前后读出来结果不一致

二、Java中使用事务

JDBC事务

JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。

1 java.sql.Connection 提供了以下控制事务的方法:
2 
3 public void setAutoCommit(boolean)
4 public boolean getAutoCommit()
5 public void commit()
6 public void rollback()

使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。
JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。

步骤:

  1. 开启事务: conn.setAutoCommit(false);
  2. 一组事务执行完毕后,提交事务 conn.commit();
  3. 可以在catch语句中显式定义回滚语句,如果不写回滚语句数据库也会自动回滚 conn.rollback();

示例

package com.kuang.lesson03;

import com.kuang.lesson02.utils.JdbcUtils;

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

public class TestTransaction {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pst = null;
        ResultSet rs = null;

        try {
            conn = JdbcUtils.getConnection();

            //关闭数据库的自动提交,自动开启事务
            conn.setAutoCommit(false);//开启事务
										
            String sql1 = "update account set money=money-100 where name='a'";//a减100
            pst = conn.prepareStatement(sql1);
            pst.executeUpdate();

//            int x=1/0;//报错
										
            String sql2 = "update account set money=money+100 where name='b'";//b加100
            pst = conn.prepareStatement(sql2);
            pst.executeUpdate();

            conn.commit();//业务完毕,提交事务
            System.out.println("成功!");

        } catch (SQLException e) {
//            try {//如果失败,默认回滚
//                conn.rollback();//如果失败,回滚
//            } catch (SQLException ex) {
//                ex.printStackTrace();
//            }
            e.printStackTrace();
        }finally {
            JdbcUtils.release(conn,pst,rs);
        }

    }
}

提交前:

提交后:

posted @ 2021-09-23 19:02  北暮南城  阅读(263)  评论(0编辑  收藏  举报