1. 程式人生 > 實用技巧 >事務及完成轉賬功能

事務及完成轉賬功能

事務:

  一件事情有n個組成單元 要不這n個組成單元同時成功 要不n個單元就同時失敗,就是將n個組成單元放到一個事務中。

mysql事務:

   預設的事務:一條sql語句就是一個事務 預設就開啟事務並提交事務

   手動事務:

      1)顯示的開啟一個事務:start transaction

      2)事務提交:commit代表從開啟事務到事務提交 中間的所有的sql都認為有效 真正的更新資料庫

      3)事務的回滾:rollback 代表事務的回滾 從開啟事務到事務回滾 中間的所有的 sql操作都認為無效資料庫沒有被更新。

JDBC事務:

    預設是自動事務。

    執行sql語句:executeUpdate() ---- 每執行一次executeUpdate方法 代表 事務自動提交

    通過jdbc的API手動事務:

    開啟事務:conn.setAutoComnmit(false);

    提交事務:conn.commit();

    回滾事務:conn.rollback();

    注意:控制事務的connnection必須是同一個

    執行sql的connection與開啟事務的connnection必須是同一個才能對事務進行控制

DBUtils事務:

    有參構造:QueryRunner runner = new QueryRunner(DataSource dataSource);

    有參構造將資料來源(連線池)作為引數傳入QueryRunner,QueryRunner會從連 接池中獲得一個數據庫連線資源操作資料庫,所以直接使用無Connection引數 的update方法即可操作資料庫

    無參構造:QueryRunner runner = new QueryRunner();

    無參的構造沒有將資料來源(連線池)作為引數傳入QueryRunner,那麼我們在使 用QueryRunner物件操作資料庫時要使用有Connection引數的方法

事務的特性ACID:

     1)原子性(Atomicity)原子性是指事務是一個不可分割的工作單位,事務中的操作 要麼都發生,要麼都不發生。

    2)一致性(Consistency)一個事務中,事務前後資料的完整性必須保持一致。

    3)隔離性(Isolation)多個事務,事務的隔離性是指多個使用者併發訪問資料庫,一個使用者的 事務不能被其它使用者的事務所幹擾,多個併發事務之間資料要相互隔離。

    4)永續性(Durability)永續性是指一個事務一旦被提交,它對資料庫中資料的改變, 就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。

利用事務完成轉賬功能:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/TransferServlet" method="post">
轉出賬戶:<input type="text" name="out"><br>
轉入賬戶:<input type="text" name="in"><br>
金額:<input type="text" name="money"><br>
<input type="submit" value="轉賬">
</form>
</body>
</html>

    

package com.oracle.dao;

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

import org.apache.commons.dbutils.QueryRunner;

import com.oracle.tools.MyDBUtils;

public class AccountDao {
//轉出
    public int outt(Connection conn,String out,double money) throws SQLException{
        
        QueryRunner qr=new QueryRunner();
        String sql="update account set money=money-? where aname=?";
        int row=qr.update(conn,sql,money,out);
        return row;
    }
    //轉入
    public int inn(Connection conn,String in,double money) throws SQLException{
        QueryRunner qr=new QueryRunner(MyDBUtils.getDataSource());
        String sql="update account set money=money+? where aname=?";
        int row=qr.update(conn,sql,money,in);
        return row;
    }
}
package com.oracle.service;

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

import com.oracle.dao.AccountDao;
import com.oracle.tools.MyDBUtils;

public class AccountService { 
    private AccountDao accountDao=new AccountDao();
//轉賬
    public int transfer(String out,String in,double money){
        int row1=0;
        int row2=0;
        Connection conn=null;
        try {
            //獲取Connection物件
            conn=MyDBUtils.getConn();
            //開啟事物
            conn.setAutoCommit(false);
            row1=accountDao.outt(conn,out, money);
            //int y=1/0;
            row2=accountDao.inn(conn,in, money);
        } catch (Exception e) {
            //回滾
            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();
            }
        }
        if(row1>0&&row2>0){
            return 1;
        }else{
            return 0;
        }
        
    }
}
package com.oracle.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.oracle.service.AccountService;

public class TransferServlet extends HttpServlet {
private AccountService accountService=new AccountService();
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解決請求亂碼
        request.setCharacterEncoding("UTF-8");
        String out=request.getParameter("out");
        String in=request.getParameter("in");
        String mon=request.getParameter("money");
        double money=Double.parseDouble(mon);
        //呼叫轉賬方法
        int row=accountService.transfer(out, in, money);
        response.setContentType("text/html;charset=UTF-8");
        if(row>0){
            response.getWriter().write("轉賬成功!");
        }else{
            response.getWriter().write("轉賬失敗!");
        }
    }

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