一、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);
}
}
}
}