什么时候开启事务、提交事务、回滚事务?
事务的开启
事务的提交
事务的回滚
自己写的事务的代码
package homework01;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.junit.Test;
import myUtils.JDBCUtil;
public class Test01 {
/*
* 总结整个数据库连接对象,无论是driud还是c3p0都要返回给数据库连接操作来将数据连接
* 操作数据基本的用PreparedStatement对象来操作,
* 如果用DBUtils就是将QueryRunner创建对象,如果是增删改就用update,如果是查就用query
*/
@Test
public void Demo01() throws SQLException{
Connection conn = JDBCUtil.getConnection();
//将事务开启,注意这里false才是开启事务,true是自动提交事务
conn.setAutoCommit(false);
String sql="UPDATE accoumt SET money=money+1000 WHERE NAME='小张'";
PreparedStatement ps = conn.prepareStatement(sql);
String sql1="UPDATE accoumt SET money=money-1000 WHERE NAME='小凤' ";
PreparedStatement ps1 = conn.prepareStatement(sql1);
ps.executeUpdate();
ps1.executeUpdate();
//自己设置将事务在这里提交
conn.commit();
//将事务回滚,回到操作之前
conn.rollback();
}
}
实现aaa向bbb转账1000块的案例代码:掌握开启事务、提交事务、回滚事务的地方
在转账中没有添加事务的管理,出现aaa账号的钱被转丢了,但是bbb账号的钱没有任何变化。需要给转账的功能添加事务的管理。
在转账中添加事务管理
@Test
/**
* 完成转账的案例
*/
public void demo1(){
Connection conn = null;
PreparedStatement pstmt = null;
try{
/**
* 完成转账代码:
* * 扣除某个账号的钱
* * 给另外一个账号加钱
*/
// 获得连接:
conn = JDBCUtils.getConnection();
// 开启事务
conn.setAutoCommit(false);
// 编写SQL语句:
String sql = "update account set money = money + ? where name = ?";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
// 设置参数:
// 用aaa账号给bbb账号转1000元
pstmt.setDouble(1, -1000);
pstmt.setString(2, "aaa");
// 执行SQL:扣除aaa账号1000元
pstmt.executeUpdate();
int i = 1 / 0;
// 给bbb账号加1000
pstmt.setDouble(1, 1000);
pstmt.setString(2, "bbb");
pstmt.executeUpdate();
// 提交事务:
conn.commit();
}catch(Exception e){
// 回滚事务:
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
JDBCUtils.release(pstmt, conn);
}