事务的基本使用

2016-11-28  本文已影响0人  折腾怪

闲来无事,写一写事务的简单用法。

先假设有这样一个场景,A转账给B若干人民币,其中的流程可以简单理解为:系统先从A账户上扣除相应金额,然后再加到B的账户上去。可是如果在其中由于某种原因导致没有将金额加到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();
            }
        }
    }

}
上一篇 下一篇

猜你喜欢

热点阅读