事务的编写规范与Hibernate绑定session

一、事务的编写规范

  1、事务的基本概念:

     数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性

     单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使

     应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的一个逻辑工作单

     位,由DBMS中的事务管理子系统负责事务的处理。

  2、特性:
    原子性、一致性、隔离性和持久性。
  3、不考虑隔离性会出现的问题。
    (1)脏读
    (2)不可重复读
    (3)虚读
  4、设置事务的隔离性
    (1)Read Uncommitted :1级。允许你读取还未提交的已经改变的数据。可能导致脏读、虚读、不可重复读问题。
    (2)Read Committed:2级。允许在并发事务已经提交后读取。可以防止脏读,但虚读和不可重复读仍有可能发生。
    (3)Repeatable Read:4级。对相同字段的多次读取是一致的,除非数据被事务本身改变。但虚读还是有可能出现。
    (4)serializable  :8级。完全服从AIDC的隔离原则,确保不发生脏读、虚读和不可重复读。

  5、事务的规范代码结构

    

    
        try {
            //开启事物
            
            //操作数据
            
            //提交事物
        } catch (Exception e) {
            // 事务回滚
        }finally{
            //释放资源
        }

   6、规范代码示例

@Test
    public void test8(){
        
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {
            //开启事物
            sessionFactory = HibernateUtils.getFactory();
            session = sessionFactory.openSession();
            tx = session.beginTransaction();
            //操作数据
            UserEntity user1 = session.get(UserEntity.class, 2);
            System.out.println(user1);    
            //提交事物
            tx.commit();
        } catch (Exception e) {
            // 事务回滚
            tx.rollback();
        }finally{
            //释放资源
            session.close();
            sessionFactory.close();
        }
    }

二、Hibernate绑定session

  1、session类似于JDBC中的Connection连接。

  2、绑定session,底层是使用threadLoacl.

  3、绑定原因:session是单线程的,一个session只能被一个线程使用,绑定后可以防止一个session被多个线程使用,出现异常。

  4、绑定步骤:

    (1)在核心配置文件中进行配置(必须要配置)

    <!-- 在hibernate核心配置文件中配置 -->
        <property name="hibernate.current_session_context_class">thread</property>

    (2)编写代码:

@Test
    public void test9(){
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {    
            sessionFactory = HibernateUtils.getFactory();
            session = sessionFactory.getCurrentSession();
            tx = session.beginTransaction();
            UserEntity user1 = session.get(UserEntity.class, 2);
            System.out.println(user1);    
            tx.commit();
        } catch (Exception e) {    
            tx.rollback();
        }finally{
            sessionFactory.close();
        }
    }

  5、使用该绑定线程在结束后不需要手动关闭该session,该session会随着线程的结束而自动关闭。

      验证自动关闭

      代码:

        

@Test
    public void test10(){
        SessionFactory sessionFactory = null;
        Session session = null;
        Transaction tx = null;
        try {    
            sessionFactory = HibernateUtils.getFactory();
            session = sessionFactory.getCurrentSession();
            tx = session.beginTransaction();
            UserEntity user1 = session.get(UserEntity.class, 2);
            System.out.println(user1);    
            tx.commit();
        } catch (Exception e) {    
            tx.rollback();
        }finally{
            session.close();
            sessionFactory.close();
        }
    }

 

      结果:测试出现异常,提示该session已经被关闭。

        

 

posted @ 2017-06-03 16:38  一条路上的咸鱼  阅读(342)  评论(0编辑  收藏  举报