JDBC事务管理package c.cn.itcast.transaction;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
import org.junit.Test;
import b.cn.itcast.utils.JdbcUtils;
public class TransactionTest {
// 模拟 转账 : ccc 向 bbb借 100 块钱, bbb 没有, bbb又去 找 aaa借了 100 块钱, 然后 再 借给 ccc
// 分析 : 会有 几条 sql语句 :
// aaa --->> bbb 100 , 两条 sql语句
// bb --->> ccc 100 , 两条 sql语句
// 首先 那么 转账 : 这4 条 sql语句 的处于 1 个 事务中
/*
* 小结 :
*
* 1. 设置 回滚 点 随意可以 设置 可多个, 但是 需要 符合 逻辑
* 2. 要想 这么些 个 sql语句 处于 一个 事务中 ,需要 是同一个 connection对象 .
*
* 3. 在jdbc开启事务 : setAutoCommit(false)
* 回滚事务: rollback;
* 确认提交事务 : commit
*
* 这三个 方法 都是 处于 connection对象中
*
*
*
*/
@Test
public void test2(){
Connection conn = null;
Statement stmt = null;
Savepoint sp = null;
try {
conn = JdbcUtils.getConnection();
conn.setAutoCommit(false); // 开启事务
stmt = conn.createStatement();
sp = conn.setSavepoint();
// aaa 向 bbb 转钱
stmt.executeUpdate("update account set money=money-100 where name='aaa'");
int j =1/0;
stmt.executeUpdate("update account set money=money+100 where name='bbb'");
// 设置 回滚点
sp = conn.setSavepoint();
// bbb 向 ccc 转钱
stmt.executeUpdate("update account set money=money-100 where name='bbb'");
int i =1/0;
stmt.executeUpdate("update account set money=money+100 where name='ccc'");
//如果 整个 操作 没有问题, 则会走到这里, 就 提交事务
//conn.commit();
} catch (Exception e) {
try {
conn.rollback(sp);
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
//
try {
//由于 不管成功与否 ,都需要 commit, 所以 将 commit 放到 finally中执行
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
JdbcUtils.release(null, stmt, conn);
}
}
// 模拟 用户 aaa --->> bbb转账 100 元钱
@Test
public void test1(){
Connection conn = null;
Statement stmt = null;
try {
conn = JdbcUtils.getConnection();
conn.setAutoCommit(false); // 哥们, 不要 自动提交, 相当于 开启 一个 事务
stmt = conn.createStatement();
// 将 aaa 的账户 - 100
stmt.executeUpdate("update account set money=money-100 where name='aaa'");
int i =1/0; // 会抛 一个数学 异常
stmt.executeUpdate("update account set money=money+100 where name='bbb'");
// 提交 事务
conn.commit();
} catch (Exception e) {
// 将异常 放大 到最大, 这样 只要有异常, 就会 进入catch中.
try {
// 如果 有任何异常 , 就回滚
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
JdbcUtils.release(null, stmt, conn);
}
}
}
package c.cn.itcast.transaction;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
import org.junit.Test;
import b.cn.itcast.utils.JdbcUtils;
public class TransactionTest {
// 模拟 转账 : ccc 向 bbb借 100 块钱, bbb 没有, bbb又去 找 aaa借了 100 块钱, 然后 再 借给 ccc
// 分析 : 会有 几条 sql语句 :
// aaa --->> bbb 100 , 两条 sql语句
// bb --->> ccc 100 , 两条 sql语句
// 首先 那么 转账 : 这4 条 sql语句 的处于 1 个 事务中
/*
* 小结 :
*
* 1. 设置 回滚 点 随意可以 设置 可多个, 但是 需要 符合 逻辑
* 2. 要想 这么些 个 sql语句 处于 一个 事务中 ,需要 是同一个 connection对象 .
*
* 3. 在jdbc开启事务 : setAutoCommit(false)
* 回滚事务: rollback;
* 确认提交事务 : commit
*
* 这三个 方法 都是 处于 connection对象中
*
*
*
*/
@Test
public void test2(){
Connection conn = null;
Statement stmt = null;
Savepoint sp = null;
try {
conn = JdbcUtils.getConnection();
conn.setAutoCommit(false); // 开启事务
stmt = conn.createStatement();
sp = conn.setSavepoint();
// aaa 向 bbb 转钱
stmt.executeUpdate("update account set money=money-100 where name='aaa'");
int j =1/0;
stmt.executeUpdate("update account set money=money+100 where name='bbb'");
// 设置 回滚点
sp = conn.setSavepoint();
// bbb 向 ccc 转钱
stmt.executeUpdate("update account set money=money-100 where name='bbb'");
int i =1/0;
stmt.executeUpdate("update account set money=money+100 where name='ccc'");
//如果 整个 操作 没有问题, 则会走到这里, 就 提交事务
//conn.commit();
} catch (Exception e) {
try {
conn.rollback(sp);
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
//
try {
//由于 不管成功与否 ,都需要 commit, 所以 将 commit 放到 finally中执行
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
JdbcUtils.release(null, stmt, conn);
}
}
// 模拟 用户 aaa --->> bbb转账 100 元钱
@Test
public void test1(){
Connection conn = null;
Statement stmt = null;
try {
conn = JdbcUtils.getConnection();
conn.setAutoCommit(false); // 哥们, 不要 自动提交, 相当于 开启 一个 事务
stmt = conn.createStatement();
// 将 aaa 的账户 - 100
stmt.executeUpdate("update account set money=money-100 where name='aaa'");
int i =1/0; // 会抛 一个数学 异常
stmt.executeUpdate("update account set money=money+100 where name='bbb'");
// 提交 事务
conn.commit();
} catch (Exception e) {
// 将异常 放大 到最大, 这样 只要有异常, 就会 进入catch中.
try {
// 如果 有任何异常 , 就回滚
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally{
JdbcUtils.release(null, stmt, conn);
}
}
}