mysql資料庫事務分析:實現銀行轉帳功能的優化,附代碼+實現過程

轉出賬戶:
轉入賬戶:


轉賬金額:

TransferServlet

package com.huanfeng.cn;import java.io.IOException;import java.net.URLEncoder;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class TransferServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//接受轉賬的參數request.setCharacterEncoding("UTF-8");String out = request.getParameter("out");String in = request.getParameter("in");String moneyStr = request.getParameter("money");double money = Double.parseDouble(moneyStr);//調用業務層的轉賬方法TransferService service = new TransferService();boolean isTransferSuccess = service.transfer(out,in,money);response.setContentType("text/html;charset=UTF-8");if(isTransferSuccess){response.getWriter().write("轉賬成功!!!");}else{response.getWriter().write("轉賬失敗!!!");}}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}

TransferService

package com.huanfeng.cn;import java.sql.Connection;import java.sql.SQLException;import com.huanfeng.utils.MyDataSource;public class TransferService {public boolean transfer(String out, String in, double money) {TransferDao dao = new TransferDao();boolean isTranferSuccess = true;try {MyDataSource.startTransaction();dao.out(out,money);dao.in(in,money);} catch (Exception e) {isTranferSuccess = false;//回滾事務try {MyDataSource.rollback();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();} finally{try {MyDataSource.commit();} catch (SQLException e) {e.printStackTrace();}}return isTranferSuccess;}}

TransferDao

package com.huanfeng.cn;import java.sql.Connection;import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;import org.junit.Test;import com.huanfeng.utils.MyDataSource;public class TransferDao {public void out(String out, double money) throws SQLException {QueryRunner runner = new QueryRunner();Connection conn = MyDataSource.getCurrentConnection();String sql = "update account set money=money-? where name=?";int b=runner.update(conn, sql, money,out);System.out.println(b+"aa");}public void in(String in, double money) throws SQLException {QueryRunner runner = new QueryRunner();Connection conn = MyDataSource.getCurrentConnection();String sql = "update account set money=money+? where name=?";runner.update(conn, sql, money,in);}}

數據庫

mysql數據庫事務分析:實現銀行轉賬功能的優化,附代碼+實現過程

至此程序就ok了但是這個程序還有一個問題,就是我們判斷是否轉賬成功是根據是都有異常產生的,如果有異常產生就表示轉賬不成功的,

mysql數據庫事務分析:實現銀行轉賬功能的優化,附代碼+實現過程

但是這個程序轉賬不成功也就是update執行失敗不會產生異常,只會返回0,也就是說如果我們表單中輸入的name數據庫中沒有,他也不會產生異常,不會產生異常那麼service就認為數據庫操作執行成功,所以這是不對的,應該判斷返回值,如果的返回值為0,就表示數據庫操作失敗


分享到:


相關文章: