闲来无事,写一写事务的简单用法。
先假设有这样一个场景,A转账给B若干人民币,其中的流程可以简单理解为:系统先从A账户上扣除相应金额,然后再加到B的账户上去??墒侨绻谄渲杏捎谀持衷虻贾旅挥薪鸲罴拥紹的账户上,那么这若干人民币就会不翼而飞。这时候就可以使用“事务”进行处理。
可以简单的将事务理解为一个逻辑单元,在其中有一些操作逻辑,它们是一个整体,只要在其中的任一环节操作出了问题,就可以回退到初始状态。
主要涉及到的包及方法如下:
java.sql.Connection:
setAutoCommit(boolean); //设置是否自动提交,一旦提交即可以理解为持久更改数据操作,如果设置为false,则需要手动提交
commit(); //手动提交更改,使之成为永久更改
rollback(); //回滚到初始状态
rollback(Savepoint); //配合setSavepoint()可回滚到指定的状态
setSavepoint(); //返回一个Savepoint,我将它理解成为一个状态
一言不合贴代码
package test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Savepoint;
import org.junit.Test;
import utils.DBUtil;
//测试事务
public class A {
String a1 = "UPDATE money SET money=money-500 WHERE accountName='a';";
String a2 = "UPDATE money SET money=money+500 WHERE accountName='b';";
String a3 = "UPDATE1 money SET money=money+500 WHERE accountName='b';";
@Test
public void test(){
Connection conn = DBUtil.getConnection();
Savepoint sp = null;
try {
conn.setAutoCommit(false); //设置为不自动提交
PreparedStatement pstmt;
//第一次执行
pstmt = conn.prepareStatement(a1);
pstmt.executeUpdate();
pstmt = conn.prepareStatement(a2);
pstmt.executeUpdate();
sp = conn.setSavepoint(); //设置状态
//第二次执行
pstmt = conn.prepareStatement(a1);
pstmt.executeUpdate();
pstmt = conn.prepareStatement(a3);
pstmt.executeUpdate();
} catch (SQLException e) {
try {
conn.rollback(sp); //回滚到指定的状态
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
try {
conn.commit(); //手动提交
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}