事務(wù)的基本使用

閑來(lái)無(wú)事,寫(xiě)一寫(xiě)事務(wù)的簡(jiǎn)單用法。

先假設(shè)有這樣一個(gè)場(chǎng)景,A轉(zhuǎn)賬給B若干人民幣,其中的流程可以簡(jiǎn)單理解為:系統(tǒng)先從A賬戶(hù)上扣除相應(yīng)金額,然后再加到B的賬戶(hù)上去??墒侨绻谄渲杏捎谀撤N原因?qū)е聸](méi)有將金額加到B的賬戶(hù)上,那么這若干人民幣就會(huì)不翼而飛。這時(shí)候就可以使用“事務(wù)”進(jìn)行處理。

可以簡(jiǎn)單的將事務(wù)理解為一個(gè)邏輯單元,在其中有一些操作邏輯,它們是一個(gè)整體,只要在其中的任一環(huán)節(jié)操作出了問(wèn)題,就可以回退到初始狀態(tài)。
主要涉及到的包及方法如下:

java.sql.Connection:
setAutoCommit(boolean);      //設(shè)置是否自動(dòng)提交,一旦提交即可以理解為持久更改數(shù)據(jù)操作,如果設(shè)置為false,則需要手動(dòng)提交
commit();    //手動(dòng)提交更改,使之成為永久更改
rollback();   //回滾到初始狀態(tài)
rollback(Savepoint);    //配合setSavepoint()可回滾到指定的狀態(tài)
setSavepoint();    //返回一個(gè)Savepoint,我將它理解成為一個(gè)狀態(tài)

一言不合貼代碼

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;

//測(cè)試事務(wù)
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);        //設(shè)置為不自動(dòng)提交
            PreparedStatement pstmt;
            
            //第一次執(zhí)行
            pstmt = conn.prepareStatement(a1);
            pstmt.executeUpdate();
            
            pstmt = conn.prepareStatement(a2);
            pstmt.executeUpdate();
            
            sp = conn.setSavepoint();        //設(shè)置狀態(tài)
            
            //第二次執(zhí)行
            pstmt = conn.prepareStatement(a1);
            pstmt.executeUpdate();
            
            pstmt = conn.prepareStatement(a3);
            pstmt.executeUpdate();
            
        } catch (SQLException e) {
            
            try {
                conn.rollback(sp);            //回滾到指定的狀態(tài)
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            
            e.printStackTrace();
        }finally{
            try {
                conn.commit();        //手動(dòng)提交
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 七年,2555天,61320個(gè)小時(shí),3679200分鐘,寫(xiě)成一本書(shū)也是厚厚的一本,拍成一部電視劇也是長(zhǎng)長(zhǎng)的36集,...
    二月湘南閱讀 346評(píng)論 0 1
  • 前段時(shí)間,Airbnb出了個(gè)移動(dòng)端的動(dòng)畫(huà)庫(kù)Lottie,可以和一個(gè)名叫Bodymovin的AE插件結(jié)合起來(lái),把在A...
    ui_小雞蛋閱讀 83,336評(píng)論 42 67
  • 朋友素和男友鬧矛盾了,問(wèn)題出在了遠(yuǎn)距離上,兩人一個(gè)在讀書(shū)一個(gè)在實(shí)習(xí),兩人跨了一個(gè)省,平常靠電話和聊天軟件來(lái)溝通,剛...
    月墨簫風(fēng)閱讀 1,518評(píng)論 3 3
  • 寶貝,今天的5分鐘 沒(méi)有哪個(gè)男生會(huì)喜歡一直作的女生,不過(guò)每每你對(duì)我作的時(shí)候我都好想笑。哈哈哈,明明不會(huì)作卻偏偏要裝...
    握著荊條閱讀 225評(píng)論 0 0
  • 青春時(shí)的愛(ài)戀無(wú)比炙烈 如同一頓美妙的晚餐 帶著迷幻的氣息和誘人的口感 讓人不自禁地去靠近去觸摸 吸 吮 啃 咬 直...
    飯花閱讀 298評(píng)論 0 0

友情鏈接更多精彩內(nèi)容