?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(); } } }
?
?