zoukankan      html  css  js  c++  java
  • 事务的编写规范与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已经被关闭。

            

  • 相关阅读:
    php内存管理机制与垃圾回收机制
    PHP Laravel5实现的RBAC权限管理操作示例
    PHP实现微信企业付款到个人零钱步骤
    ThinkPHP 6.0 管道模式与中间件的实现分析
    深入讲解 Laravel 的 IoC 服务容器
    ThinkPHP6 核心分析:系统服务
    PHP 性能优化
    PHP 7.4 新语法:箭头函数
    深入理解 PHP 的 7 个预定义接口
    Java实现 LeetCode 795 区间子数组个数 (暴力分析)
  • 原文地址:https://www.cnblogs.com/jack1995/p/6937704.html
Copyright © 2011-2022 走看看