zoukankan      html  css  js  c++  java
  • JavaWeb_(Hibernate框架)Hibernate中事务

    Hibernate中事务

    • 事务的性质
    • 事物的隔离级别
    • 配置事务的隔离级别

    事务的性质

      原子性:原子,不可再分,一个操作不能分为更小的操作,要么全都执行,要么全不执行。

      一致性:事务在完成时,必须使得所有的数据保持一致的状态。(与开始事务保持前一样的状态)

      隔离性:事务查看数据时数据所处的状态,要么是另一个并发事务修改它之前的状态,要么是另一并发事务修改它之后的状态,事务不会查看中间状态的数据。

      持久性:事务完成之后,它对于系统的影响是永久性的(执行了就执行了,没有撤回(悔棋)的说法)

    事务的隔离级别

      脏读:读取了未提交事务中的数据

      不可重复复读:对于数据库中的某个数据,一个事务范围内多次读取同一个数据,却有不同的值

      幻读:一个事务读到另一个事务新增加并提交的数据(insert)。在同一个事务中,对于同一组数据读取到的结果不一致

     配置事务的隔离级别

      读未提交: 最低的隔离级别,最没用(最快)

      读已提交: 可避免脏读,不能避免不可重复读

      可重复度: 可以避免不可重复读,可以避免脏读(mysql默认)

      串行化: 最强大,三种都可以解决(最慢)

      

      项目中在hibernate.cfg.xml配置事务的隔离级别【mysql数据库中默认是配置4:可重复读】

            <!-- 配置数据库的隔离级别 
               1:读未提交: 最低的隔离级别,最没用(最快)
               2:读已提交: 可避免脏读,不能避免不可重复读
    
               4: 可重复度: 可以避免不可重复读,可以避免脏读(mysql默认)
               8: 串行化: 最强大,三种都可以解决(最慢)
            -->
    
            <property name="hibernate.connection.isolation">4</property>
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <!-- 负责初始化     -->
        <session-factory>
     
            <!-- 连接数据库驱动 -->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <!-- 数据库地址 -->
            <property name="hibernate.connection.url">jdbc:mysql:///hibernatest</property>
            <!-- 数据库用户名 -->
            <property name="hibernate.connection.username">root</property>
            <!-- 数据库密码 -->
            <property name="hibernate.connection.password">123456</property>
            
            <!-- 配置数据库的方言 -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            
            <!-- 将hibernate生成的SQL语句打印到控制台上 -->
            <property name="hibernate.show_sql">true</property>
            <!-- 格式化hibernate生成的sql语句 -->
            <property name="hibernate.format_sql">true</property>
            
            <!-- hibernate自动创建表 
                create:            自动创建表,每次框架运行都会创建一张新的表,原来的数据将丢失(开发)
                create-drop:    自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
                update(推荐):        自动生成表,如果表已经存在,则更新数据,如果表不存在,就会创建一张新的表
                validate:               加载hibernate时,验证创建数据库表结构
            
            -->
            <property name="hibernate.hbm2ddl.auto">create</property>
            
            
            <!-- 配置数据库的隔离级别 
               1:读未提交: 最低的隔离级别,最没用(最快)
               2:读已提交: 可避免脏读,不能避免不可重复读
    
               4: 可重复度: 可以避免不可重复读,可以避免脏读(mysql默认)
               8: 串行化: 最强大,三种都可以解决(最慢)
            -->
    
            <property name="hibernate.connection.isolation">4</property>
    
            <mapping resource= "com/Gary/domain/User.hbm.xml"/>
                
        </session-factory>
    
    
    </hibernate-configuration>
    hibernate.cfg.xml

      实现HibernateUtils.java工具类:使用工厂模式将开启Hibernate事务代码提取出来

    package com.Gary.utils;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtils {
    
        private static SessionFactory sessionFactory = null;
        
        static {
            //得到配置信息
            Configuration config = new Configuration().configure();
            //获得sessionFactiory工厂
            sessionFactory = config.buildSessionFactory();
        }
        
        //获得全新的Session
        public static Session getSession()
        {
            ;
            //获取session
            Session session = sessionFactory.openSession();
            return session;
            
        }
        
        public static Session getCurrentSession()
        {
            return  sessionFactory.getCurrentSession();
        }
        
    }
    HibernateUtils.java

      使用HibernateUtils.java打开事务

      Session session = HibernateUtils.getSession();
            
       //打开事务
       Transaction transcation = session.beginTransaction();

       使用HibernateUtils.java实现向数据库中用户注册事务

    //增加用户
        public void addUser(User user) {
            
            
            Session session = HibernateUtils.getSession();
            
            //打开事务
            Transaction transcation = session.beginTransaction();
            
            //存储user对象save         只是为了生成id
            //有id,与session有关联,持久化状态
        
            //存储user对象
            session.save(user);            //有id,与session关联  持久化状态    本质:对象状态的转换
                                        //将瞬时->持久    目的:生成id
            
            //提交事务
            transcation.commit();
            //关闭资源
            session.close();    //没有与session关联,有id
    
            
        }
  • 相关阅读:
    返回一个整型数组中最大子数组的和
    matlab的优缺点
    Android 软件自动更新功能的实现
    Android的依赖注入框架:Dagger
    Wireshark解密HTTPS数据流
    QQ恶搞
    QQ恶搞
    编程语言的分类
    Windows常用快捷键与常用命令
    Chrome去掉标签页8个框
  • 原文地址:https://www.cnblogs.com/1138720556Gary/p/11852156.html
Copyright © 2011-2022 走看看