事务及完成转账功能

事务:

  一件事情有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);
    }
}

   

原文地址:https://www.cnblogs.com/maxuefeng/p/14014843.html