轉(zhuǎn)賬操作代碼實(shí)現(xiàn)----事務(wù)

在進(jìn)行轉(zhuǎn)賬操作時(shí)跟衅,我們要保證數(shù)據(jù)的統(tǒng)一性。(例如璃饱,當(dāng)一個(gè)賬戶轉(zhuǎn)出金額過程中,如果出現(xiàn)系統(tǒng)錯(cuò)誤或者說是停電斷網(wǎng)等特殊情況肪康,將會(huì)發(fā)生轉(zhuǎn)出賬戶減少荚恶,轉(zhuǎn)入賬戶金額未添加的情況。)因此磷支,我們需要通過事務(wù)控制:
注意點(diǎn):在事務(wù)控制語句代碼中谒撼,要保證Connection是同一個(gè)

目錄結(jié)構(gòu):

image.png

web層servlet客戶端交互代碼:

package com.zys.transfer.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zys.transfer.service.TransferService;

public class TransferServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        
        //接收轉(zhuǎn)賬的參數(shù),傳遞給service層
        String out = request.getParameter("out");
        String in = request.getParameter("in");
        String moneyStr = request.getParameter("money");
        double money = Double.parseDouble(moneyStr);//強(qiáng)制轉(zhuǎn)化成double類型
        
        //調(diào)用業(yè)務(wù)層的轉(zhuǎn)賬方法
        TransferService service = new TransferService();
        Boolean TransferIsSuccess = service.transfer(out,in,money);
        
        if(TransferIsSuccess){
            response.getWriter().write("轉(zhuǎn)賬成功");
        }else{
            response.getWriter().write("轉(zhuǎn)賬失敗");
        }
        
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

service層業(yè)務(wù)邏輯處理代碼:

package com.zys.transfer.service;

import java.sql.Connection;
import java.sql.SQLException;

import com.zys.transfer.dao.TransferDao;
import com.zys.utils.DataSourceUtils;

public class TransferService {

    public Boolean transfer(String out, String in, double money) {
        
        TransferDao dao = new TransferDao();
        
        Boolean TransferIsSuccess = true;
        
        Connection conn = null;
        try {
            
            //開啟事務(wù)
            conn = DataSourceUtils.getConnection();
            conn.setAutoCommit(false);
            
            //轉(zhuǎn)出錢的方法
            dao.out(conn,out,money);
            //轉(zhuǎn)入錢的方法
            dao.in(conn,in,money);
        } catch (Exception e) {
            TransferIsSuccess = false;
            //回滾事務(wù)
            try {
                conn.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            try {
                conn.commit();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        
        return TransferIsSuccess;
    }

}

dao層數(shù)據(jù)庫交互代碼:

package com.zys.transfer.dao;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import com.zys.utils.DataSourceUtils;

public class TransferDao {

    public void out(Connection conn,String out, double money) throws SQLException {
        QueryRunner runner = new QueryRunner();
        //Connection conn = DataSourceUtils.getConnection();
        String sql = "update account set money=money-? where name=?";
        runner.update(conn, sql, money,out);
        
    }

    public void in(Connection conn,String in, double money) throws SQLException {
        QueryRunner runner = new QueryRunner();
        //Connection conn = DataSourceUtils.getConnection();
        String sql = "update account set money=money+? where name=?";
        runner.update(conn, sql, money,in);
        
    }

}




通過TheadLocal對(duì)象獲取Connection方式實(shí)現(xiàn):

因?yàn)閟ervice層是處理業(yè)務(wù)邏輯的雾狈,dao層是處理數(shù)據(jù)庫的廓潜,conn不應(yīng)該在service層出現(xiàn),用此種方式可以實(shí)現(xiàn)善榛,而保證在一個(gè)訪問中三層架構(gòu)Connection為同一個(gè)辩蛋。

service層業(yè)務(wù)邏輯處理代碼:

package com.zys.transfer.service;

import java.sql.Connection;
import java.sql.SQLException;

import com.zys.transfer.dao.TransferDao;
import com.zys.utils.DataSourceUtils;

public class TransferService {

    public Boolean transfer(String out, String in, double money) {
        
        TransferDao dao = new TransferDao();
        
        Boolean TransferIsSuccess = true;
        
        Connection conn = null;
        try {
            //使用TheaadLocal存儲(chǔ)Connection
            
            //開啟事務(wù)
            //conn = DataSourceUtils.getConnection();
            //conn.setAutoCommit(false);
            DataSourceUtils.startTransaction();
            
            
            //轉(zhuǎn)出錢的方法
            dao.out(out,money);
            //轉(zhuǎn)入錢的方法
            dao.in(in,money);
        } catch (Exception e) {
            TransferIsSuccess = false;
            //回滾事務(wù)
            try {
                //conn.rollback();
                DataSourceUtils.rollback();
            } catch (SQLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally{
            //提交事務(wù)
            try {
                //conn.commit();
                DataSourceUtils.commitAndRelease();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        
        return TransferIsSuccess;
    }

}

dao層數(shù)據(jù)庫交互代碼:

package com.zys.transfer.dao;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import com.zys.utils.DataSourceUtils;

public class TransferDao {

    public void out(String out, double money) throws SQLException {
        QueryRunner runner = new QueryRunner();
        Connection conn = DataSourceUtils.getCurrentConnection();
        String sql = "update account set money=money-? where name=?";
        runner.update(conn, sql, money,out);
        
    }

    public void in(String in, double money) throws SQLException {
        QueryRunner runner = new QueryRunner();
        Connection conn = DataSourceUtils.getCurrentConnection();
        String sql = "update account set money=money+? where name=?";
        runner.update(conn, sql, money,in);
        
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市移盆,隨后出現(xiàn)的幾起案子悼院,更是在濱河造成了極大的恐慌,老刑警劉巖咒循,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件据途,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叙甸,警方通過查閱死者的電腦和手機(jī)颖医,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裆蒸,“玉大人熔萧,你說我怎么就攤上這事×诺唬” “怎么了哪痰?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)久妆。 經(jīng)常有香客問我晌杰,道長(zhǎng),這世上最難降的妖魔是什么筷弦? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任肋演,我火速辦了婚禮抑诸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爹殊。我一直安慰自己蜕乡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布梗夸。 她就那樣靜靜地躺著层玲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪反症。 梳的紋絲不亂的頭發(fā)上辛块,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天械姻,我揣著相機(jī)與錄音移袍,去河邊找鬼。 笑死岗钩,一個(gè)胖子當(dāng)著我的面吹牛胞谈,可吹牛的內(nèi)容都是我干的尘盼。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼烦绳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼卿捎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起径密,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤娇澎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后睹晒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趟庄,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年伪很,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戚啥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锉试,死狀恐怖猫十,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呆盖,我是刑警寧澤拖云,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站应又,受9級(jí)特大地震影響宙项,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜株扛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一尤筐、第九天 我趴在偏房一處隱蔽的房頂上張望汇荐。 院中可真熱鬧,春花似錦盆繁、人聲如沸掀淘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽革娄。三九已至,卻和暖如春冕碟,著一層夾襖步出監(jiān)牢的瞬間拦惋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工鸣哀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留架忌,地道東北人吞彤。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓我衬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親饰恕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挠羔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • java事務(wù)的處理 轉(zhuǎn) https://www.cnblogs.com/Bonker/p/5417967.html...
    小小的Jobs閱讀 1,408評(píng)論 0 1
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,815評(píng)論 0 11
  • 1.從傳統(tǒng)三層架構(gòu)與DDD分層架構(gòu)的編程演變其實(shí)是思想的演變。 傳統(tǒng)三層架構(gòu)埋嵌,即用戶界面層UI破加、業(yè)務(wù)邏輯層BAL、...
    咖啡電視閱讀 8,235評(píng)論 0 6
  • IOC 控制反轉(zhuǎn)容器控制程序?qū)ο笾g的關(guān)系雹嗦,而不是傳統(tǒng)實(shí)現(xiàn)中范舀,有程序代碼之間控制,又名依賴注入了罪。All 類的創(chuàng)建锭环,...
    irckwk1閱讀 950評(píng)論 0 0
  • 大V課程:關(guān)于親子教育,夫妻關(guān)系泊藕,中英文繪本啟蒙辅辩,關(guān)于孩子的喂養(yǎng),青春期孩子的教育娃圆,以及怎樣成為一個(gè)智慧的女人……...
    讓愛不缺席_土豆閱讀 1,577評(píng)論 0 0