zoukankan      html  css  js  c++  java
  • mybatis学习八 事物

    1.事物的定义:

    是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。

    2,事物的特性:

    一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。

    3. mybatis中的事物

      3.1, 在 mybatis 中默认是关闭了 JDBC 的自动提交功能
        3.1.1 每一个 SqlSession 默认都是不自动提交事务.
        3.1.2 session.commit()提交事务.
        3.1.3 openSession(true);自动提交.setAutoCommit(true);

      3.2  mybatis 底层是对 JDBC 的封装.

        3.2.1 JDBC 中 executeUpdate()执行新增,删除,修改的 SQL.返回值 int,表示受影响的行数.

        3.2.2 mybatis 中<insert> <delete> <update>标签没有 resultType 属性,认为返回值都是 int

      3.3 在 openSession()时 Mybatis 会创建 SqlSession 时同时创建一个Transaction(事务对象),同时     autoCommit 都为 false,如果出现异常,应该 session.rollback()回滚事务. 在mybatis中,事物的自动提交被关闭了。并且在mybatis中,在同一个sqlSession中的所有的操作都在一个事物中

        //加载配置文件
            InputStream in = Resources.getResourceAsStream("mybatis.xml");
            //使用工厂设计模式   【注意】以后sqlSessionFactory都会被spring 管理,不需要我们自己创建
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(in);
            
            //获取sqlSession
            SqlSession sqlSession=sqlSessionFactory.openSession();
        try {
                sqlSession.insert("包名.insert标签id", "参数");
                sqlSession.commit();//提交事物
            }catch(Exception e) {
                sqlSession.rollback();//回滚事物
            }finally {
                sqlSession.close();
            }

      在jdbc中,conn的autoCommit是true的,所以在jdbc中每一条语句都是一个事物,若是想多条语句组成一个事物,需要手动设置,手动提交。

    public void JdbcTransfer() { 
        java.sql.Connection conn = null;
         try{ 
            conn = conn =DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","userpwd");
             // 将自动提交设置为 false,
             //若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交
             conn.setAutoCommit(false);
    
             stmt = conn.createStatement(); 
             // 将 A 账户中的金额减少 500 
             stmt.execute("
             update t_account set amount = amount - 500 where account_id = 'A'");
             // 将 B 账户中的金额增加 500 
             stmt.execute("
             update t_account set amount = amount + 500 where account_id = 'B'");
    
             // 提交事务
             conn.commit();
             // 事务提交:转账的两步操作同时成功
         } catch(SQLException sqle){            
             try{ 
                 // 发生异常,回滚在本事务中的操做
                conn.rollback();
                 // 事务回滚:转账的两步操作完全撤销
                 stmt.close(); 
                 conn.close(); 
             }catch(Exception ignore){ 
    
             } 
             sqle.printStackTrace(); 
         } 
    }



       

  • 相关阅读:
    <<信息学奥赛一本通>> 昆虫养殖 题解
    C++ primer 第七章 练习7.35 类作用域练习
    C++ primer 第六章 练习6.56 函数指针练习
    P1145 约瑟夫
    C++ 查看auto delctype 后变量的类型。(小技巧)
    Educational Codeforces Round 24 题解
    HDU 5279 分治NTT 图的计数
    BZOJ 3473
    BZOJ 3514 LCT+主席树
    看无可看 分治FFT+特征值方程
  • 原文地址:https://www.cnblogs.com/cplinux/p/9637138.html
Copyright © 2011-2022 走看看