zoukankan      html  css  js  c++  java
  • JDBC事务处理

    package cn.code.demo;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    
    public class AccountDao {
        /*
         * 修改指定用户余额
         * */
        //为了避免使用不同的Connection,所以采用传递链接的方式保证事物中使用同一个链接;
        public void updateBalance(Connection con,String username,double balance){
            try{
                String sql = "update account set balance=balance+? where name=?";
                PreparedStatement ps=con.prepareStatement(sql);
                ps.setDouble(1, balance);
                ps.setString(2, username);
                ps.executeUpdate();
            }catch(Exception e){throw new RuntimeException(e);}
        }
    }

    //根据上面提供的业务情景,完成事务处理

    package cn.code.demo;
    /*
     * 1、事物四大特性:
     * 原子性(不可再分割,不可能成功一半)
     * 隔离性(并发进行提交多个事物进行隔离)
     * 一致性(操作前后数据保持一致)
     * 持久性(一旦事物提交成功,事物中所有的数据操作都必须被持久化)
     * mysql中开启事物:
     * 开启事物:start tansaction;
     * 结束事物:commit;或rollback;
     * 事物并发问题:
     * 脏读:读取到一个事物未提交的数据。
     * 不可重复读:对同一条记录两次读取不一致,因为另一事物对该记录做了修改;
     * 幻读(虚读):对同一张表的两次查询不一致,以为另一事物插入了一条记录;
     * 四种隔离级别:
     * 串行化:serializable
     * 可重复读:repeatable(mysql) 不能处理幻读,防止脏读和不可重复读
     * 读已提交数据:read committed(oracle) 防止脏读,没有处理可重复度和幻读
     * 读未提交数据:read uncommitted 性能最好,但是可能出现事务并发问题,没有处理脏读、幻读、可重复读
     * 设置事物隔离级别con.setTrasactionisolation();
     * */
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import org.junit.Test;
    
    import cn.code.DBUtils1.DBUtils1;
    
    /*
     * 
     * */
    public class Demo1 {
        public void zhuanzhang(String from,String to,double money){
            //对事物操作必须使用Connection对象,那么必须保证同一个事物使用同一个Connection
            //
            Connection con = null;
            try{
                con =DBUtils1.getConnection();//获取了一个新连接
                con.setAutoCommit(false);
                AccountDao dao = new AccountDao();
                dao.updateBalance(con,from, -money);//减去金额,传递原有链接
                dao.updateBalance(con,to, money);//加上金额,传递原有链接
                con.commit();
            }catch(Exception e){
                try {
                    con.rollback();
                } catch (SQLException e1) {
                }
            }
        }
        @Test
        public void test(){
            zhuanzhang("zs","ls",100);
        }
    }
  • 相关阅读:
    .net core web api swagger 配置笔记
    mvc下ajax请求遇到session超时简单处理方式
    sql ltrim/rtrim 字段中为中文时出现?的问题
    SQL 将一个字段内用逗号分隔的内容分成多条记录
    bootstrap下modal模态框中webuploader控件按钮异常(无法点击)问题解决办法【转】
    mvc 封装控件使用mvcpager
    uploadify在chrome下初始化失败,在Firefox下却可以原因探析
    MVC FormCollection 无法获取值的问题
    linq to sql之like
    mvcpager 表单提交时无法获取pageindex的值
  • 原文地址:https://www.cnblogs.com/wangyinxu/p/7428195.html
Copyright © 2011-2022 走看看