事務及完成轉賬功能
事務:
一件事情有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); } }