一、JDBC事务控制管理
1.1.什么是事务
事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
例如:A——B转帐,对应于如下两条sql语句
update account set money=money-100 where name=‘a’;
update account set money=money+100 where name=‘b’;
数据库默认事务是自动提交的,也就是发一条sql它就执行一条。如果想多条sql放在一个事务中执行,则需要使用如下语句。
数据库开启事务命令:
start transaction 开启事务
Rollback 回滚事务
Commit 提交事务
1.2.事务的使用
当Jdbc程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动向数据库提交在它上面发送的SQL语句。若想关闭这种默认提交方式,让多条SQL在一个事务中执行,可使用下列语句:
JDBC控制事务语句
Connection.setAutoCommit(false); // 相当于mysql语句的start transaction
Connection.rollback(); // 相当于mysql语句的 rollback
Connection.commit(); // 相当于mysql语句的 commit
1.3.演示银行转帐案例
在JDBC代码中使如下转帐操作在同一事务中执行。
update from account set money=money-100 where name=‘a’;
update from account set money=money+100 where name=‘b’;
设置事务回滚点
Savepoint sp = conn.setSavepoint();
Conn.rollback(sp);
Conn.commit();
package demo5; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Savepoint; import utils.JdbcUtils; /** * 演示银行转帐案例 * * @author mChenys * */ public class TransactionTest { public static void main(String[] args) { test(); } private static void test() { Connection conn = JdbcUtils.getConnection(); PreparedStatement stmt = null; Savepoint myPoint = null; if (null != conn) { try { // 关闭自动提交事务 conn.setAutoCommit(false); // 设置回滚点 myPoint = conn.setSavepoint(); // 预定义sql语句 String sql1 = "update account set money = money-100 where name = ?"; String sql2 = "update account set money = money+100 where name = ?"; // 执行sql语句1 stmt = conn.prepareStatement(sql1); stmt.setString(1, "a"); stmt.executeUpdate(); // 模拟错误 int a = 1 / 0; // 执行sql语句2 stmt = conn.prepareStatement(sql2); stmt.setString(1, "b"); stmt.executeUpdate(); } catch (Exception e) { e.printStackTrace(); // 发生异常后,回滚到回滚点 try { if (null != conn) { conn.rollback();// 默认回滚到事物的开始点 // conn.rollback(myPoint);// 回滚到离错误发生最近的回滚点 } } catch (SQLException e1) { e1.printStackTrace(); } } finally { // 提交事务 if (null != conn) try { conn.commit(); } catch (SQLException e) { e.printStackTrace(); } // 释放资源 JdbcUtils.release(null, stmt, conn); } } } }