事务的基本使用

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

先假设有这样一个场景,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();
            }
        }
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 七年,2555天,61320个小时,3679200分钟,写成一本书也是厚厚的一本,拍成一部电视剧也是长长的36集,...
    二月湘南阅读 295评论 0 1
  • 前段时间,Airbnb出了个移动端的动画库Lottie,可以和一个名叫Bodymovin的AE插件结合起来,把在A...
    ui_小鸡蛋阅读 82,652评论 42 67
  • 朋友素和男友闹矛盾了,问题出在了远距离上,两人一个在读书一个在实习,两人跨了一个省,平常靠电话和聊天软件来沟通,刚...
    月墨箫风阅读 1,428评论 3 3
  • 宝贝,今天的5分钟 没有哪个男生会喜欢一直作的女生,不过每每你对我作的时候我都好想笑。哈哈哈,明明不会作却偏偏要装...
    握着荆条阅读 208评论 0 0
  • 青春时的爱恋无比炙烈 如同一顿美妙的晚餐 带着迷幻的气息和诱人的口感 让人不自禁地去靠近去触摸 吸 吮 啃 咬 直...
    饭花阅读 238评论 0 0