【事务】事务

1查看是否自动提交:

show variables like’%commit%'
然后设置 set autocommit = off ;
关闭自动提交
在这里插入图片描述
这个时候对数据库操作,
最后不commit;
别人是无法看到操作的结果的,只有自己能看到。
在这里插入图片描述
commit之后
在这里插入图片描述
再次启动事务
start transaction;
设置保留点:
SAVEPOINT savepoint_name;

保存的是此次操作之前的状态。
因此 最好在操作数据之前先 savepoint start;把原数据设置一个savepoint
rollback to start;
并且rollback 一次后就失效了,但是可以back完前面的savepoint,再回到后面的savepoint;
演示:
我设置了三个savepoint:
start 初始
dele9
dele10
在这里插入图片描述
现在我先rollback to dele9;
再回rollback to dele10时就显示不存在了,这是因为回到dele9的状态你还没有设置dele10.
相反的我可以先rollback to dele10,再rollback to dele9;这是可以的。
在这里插入图片描述

代码演示:

1.Transaction 没有事务的时候 提交出现异常前面的会提交成功

package SpringWork.Transaction;

import SpringWork.Util.JDBCUtils;
import org.junit.Test;

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

public class TransactionTest
{
    @Test
    public void transactionTest1(){
        PreparedStatement pst= null;
        Connection conn =null;
        try {
            //insert into transaction1(money) values(100);
            // update transaction1 set money =1000 where id>0;
            conn= JDBCUtils.getConn();
            conn.setAutoCommit(true);
            String sql ="update transaction1 set money= money - ? where id=?";
            pst=conn.prepareStatement(sql);
            //扣钱
            pst.setInt(1,300);
            pst.setInt(2,2);
            pst.executeUpdate();
            int a=10/0;
            //加钱 2
            pst.setInt(1,-500);
            pst.setInt(2,1);
            if ( pst.executeUpdate()!=0)
                System.out.println("操作成功");
        } catch (SQLException e) {

            e.printStackTrace();
        }finally {
            JDBCUtils.close(pst,conn);
        }

    }
}

有了transaction 后异常前的也不会成功

2.JDBCUtils

package SpringWork.Util;

import org.springframework.test.context.jdbc.Sql;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;

public class JDBCUtils {
    static String driverClass="com.mysql.cj.jdbc.Driver";
    static String url="jdbc:mysql://127.0.0.1/work?useSSL=false&serverTimezone=UTC";
    static String username="root";
    static String password="123456";

    public static Connection getConn(){
        Connection conn = null;
        try {
            Class.forName(driverClass);
            conn= DriverManager.getConnection(url,username,password);
        }catch (SQLException e){
            e.printStackTrace();
        }catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return conn;
}

public static void closeAll(ResultSet rs,Statement st,PreparedStatement pst,Connection conn){
    closeRs(rs);
    closeSt(st);
    closePst(pst);
    closeConn(conn);
}
public static void close(Connection conn,Statement st){
    closeSt(st);
    closeConn(conn);
}
public static void close(ResultSet rs,Statement st,Connection conn){
    closeRs(rs);
    closeSt(st);
    closeConn(conn);
}

public static void close(PreparedStatement pst,Connection conn){
    closePst(pst);
    closeConn(conn);
}
public static void close(ResultSet rs,PreparedStatement pst,Connection conn){
    closeRs(rs);
    closePst(pst);
    closeConn(conn);
}

private static void closeConn(Connection conn){
    try{
        if (conn!=null)
            conn.close();
    }catch (SQLException e){
        e.printStackTrace();
    }finally {
        conn = null;
    }
}

private static void closeRs(ResultSet rs){
    try{
        if (rs!=null)
            rs.close();
    }catch (SQLException e){
        e.printStackTrace();
    }finally {
        rs = null;
    }
}
private static void closeSt(Statement st){
    try{
        if (st!=null)
            st.close();
    }catch (SQLException e){
        e.printStackTrace();
    }finally {
        st = null;
    }
}
private static void closePst(PreparedStatement pst){
    try{
        if (pst!=null)
            pst.close();
    }catch (SQLException e){
        e.printStackTrace();
    }finally {
        pst = null;
    }
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值