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;
                }
            }
    }
  • 相关阅读:
    [ Algorithm ] N次方算法 N Square 动态规划解决
    [ Algorithm ] LCS 算法 动态规划解决
    sql server全文索引使用中的小坑
    关于join时显示no join predicate的那点事
    使用scvmm 2012的动态优化管理群集资源
    附加数据库后无法创建发布,error 2812 解决
    浅谈Virtual Machine Manager(SCVMM 2012) cluster 过载状态检测算法
    windows 2012 r2下安装sharepoint 2013错误解决
    sql server 2012 数据引擎任务调度算法解析(下)
    sql server 2012 数据引擎任务调度算法解析(上)
  • 原文地址:https://www.cnblogs.com/111wdh/p/13544301.html
Copyright © 2011-2022 走看看