Java JDBC基础(四)

6 篇文章 0 订阅

 1.全局事务与还原点测试

package com.yli.demo;

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

/**
 * 全局事务与还原点测试
 */
public class TransactionTest {

    public static void main(String[] args) {

        // Test1();

        Test2();
    }

    /**
     * 不创建还原点回滚:即全局回滚
     */
    public static void Test1() {
        try {
            Connection conn;
            conn = ConnectionUtil.getConnection();

            // Connection默认全局事务为自动提交
            // 实则false则需要手动提交
            conn.setAutoCommit(false);

            // PreparedStatement[update]
            String sql = "update ES_T_SHOP_AFFICHE set AFFICHETITLE='iteye' where AFFICHEID=?";
            PreparedStatement preStat = conn.prepareStatement(sql);
            preStat.setInt(1, 100000493);
            preStat.executeUpdate();

            try {
                int a = 10 / 0;
                System.out.println(a);

                // 如果运行都正确:提交,一旦提交回滚也没有用
                conn.commit();
            } catch (ArithmeticException e) {
                e.printStackTrace();

                // 如果遇到错误,比如除以0:回滚
                conn.rollback();
            }

            ConnectionUtil.close(conn);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建还原点回滚:回滚到还原点
     */
    public static void Test2() {
        try {
            Connection conn;
            conn = ConnectionUtil.getConnection();

            // Connection默认全局事务为自动提交
            // 实则false则需要手动提交
            conn.setAutoCommit(false);

            // PreparedStatement[update]
            String sql = "update ES_T_SHOP_AFFICHE set AFFICHETITLE='suning' where AFFICHEID=?";
            PreparedStatement preStat = conn.prepareStatement(sql);
            preStat.setInt(1, 100000493);
            preStat.executeUpdate();

            // 创建还原点
            Savepoint savePoint1 = conn.setSavepoint("savePoint1");

            sql = "update ES_T_SHOP_AFFICHE set AFFICHETITLE='hello' where AFFICHEID=?";
            preStat = conn.prepareStatement(sql);
            preStat.setInt(1, 100000496);
            preStat.executeUpdate();

            if (true) {
                // 回滚到第一个还原点,表示从一开始执行到该还原点的事务都会正常提交
                // 而从该还原点之后执行的事务,都会回滚掉
                conn.rollback(savePoint1);
            }

            // 释放还原点
            conn.releaseSavepoint(savePoint1);

            // 最后必须要提交,只是还原点以后执行的SQL都不会提交
            conn.commit();
            
            ConnectionUtil.close(conn);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值