zoukankan      html  css  js  c++  java
  • 事务(转账功能)

    一、事务概述

    转账时必须双方同时成功,要么同时失败,就是把双方组成单元放到事务中

    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必须是同一个才能对事务进行控制

     

    一、事务的特性和隔离级别(概念性问题---面试)

    事务的特性ACID

            1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作          要么都发生,要么都不发生。 

            2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致。

            3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时,             一个用户的     事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。

            4)持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变          就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

     

     转账功能

    //jsp
    <form action="${pageContext.request.contextPath }/ZhuanzhangServlet" method="post">
       转入账户<input type="text" name="in"><br>
       转除账户<input type="text" name="out"><br>
       金额<input type="text" name="money"><br>
       <input type="submit" name="转账">
    </form>
    public class ZhuanzhangServlet extends HttpServlet {
    private AccService accService=new AccService();
        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 moneyStr=request.getParameter("money");
           double money=Double.parseDouble(moneyStr);//字符串转Double
           int row=accService.transfer(out, money, in);
           //解决响应
           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);
        }
    }
    public class AccDao {
    //转出
        public int outMoney(Connection conn,String out,double money) throws SQLException{
            QueryRunner qr=new QueryRunner();
            String sql="update account set money=money-? where name=?";
            int row=qr.update(conn,sql,money,out);
            return row;
            
        }
        public int inMoney(Connection conn,String in,double money) throws SQLException{
            QueryRunner qr=new QueryRunner();
            String sql="update account set money=money+? where name=?";
            int row=qr.update(conn,sql,money,in);
            return row;
            
        }
    }
    public class AccService {
        private AccDao accDao=new AccDao();
        //转出(转账方法)
            public int transfer(String out,double money,String in){
                int row=0;
                int row1=0;
                Connection conn=null;
                try {
                    //获取连接对象
                    conn=MyDBUtils.getConn();
                    //开启事务
                    conn.setAutoCommit(false);
                    row=accDao.outMoney(conn,out, money);    
                    int y=1/0;
                    row1=accDao.inMoney(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();
                        conn.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                if(row>0&&row1>0){
                    return 1;
                }else{
                    return 0;
                }
            }
    }
  • 相关阅读:
    对比使用Charles和Fiddler两个工具及利用Charles抓取https数据(App)
    Charles-安装和配置
    python算法-队列
    python算法-快速排序
    【Codeforces】383.DIV2
    static关键字
    UNIX环境高级编程--5
    【LeetCode】467. Unique Substrings in Wraparound String
    typedef关键字
    strcpy 和 memcpy自实现
  • 原文地址:https://www.cnblogs.com/111wdh/p/13544301.html
Copyright © 2011-2022 走看看