hibernate笔记--事务管理

  • 事务的回顾

    • 什么是事务

      • 事务:事务指的是逻辑上的一组操作,组成这组操作上的各个逻辑单元要么全部成功,要么全部失败。
    • 事务特性

      • 原子性(Atomicity )

        • 代表事务不可分割。
      • 持久性(Durability)

        • 代表事务执行完成后,数据就持久到数据库中。
      • 一致性(Consistency)

        • 代表事务执行的前后,数据的完整性保持一致。
          比如:
              转账问题,假设刘备一共有10000¥,张飞和关羽没钱,
              现在刘备转给关羽3000¥,转给张飞3000¥,则刘备剩余4000¥,
              总之,无论怎么他们怎么相互转账,总额10000¥是不会变的。

           

      • 隔离性(Isolation)

        • 代表一个事务执行过程中,不应该受到其他事务的干扰。
    • 如果不考虑隔离性,会引发安全性问题

      • 读问题

        • 脏读:一个事务读到另一个事务还没提交的事务。张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。 与此同时, 事务B正在读取张三的工资,读取到张三的工资为8000。 随后, 事务A发生异常,而回滚了事务。张三的工资又回滚为5000。 最后, 事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。
          例如:
            张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。
            与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。
            随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。
            最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。

           

        • 不可重复读:一个事务读到另一个事务已经提交的update数据,导致在前一个事务多次查询结果不一致。
          例如:
            在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。
            与此同时,事务B把张三的工资改为8000,并提交了事务。
            随后,在事务A中,再次读取张三的工资,此时工资变为8000。
              在一个事务中前后两次读取的结果并不致,导致了不可重复读。

           

        • 虚读:一个事务已经读到另一个事务已经提交的insert数据,导致其前一个事务多次查询结果不一致。
          例如:
            目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
            此时,
            事务B插入一条工资也为5000的记录。
            这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。

           

      • 写问题

        • 引发两类丢失更新
    • 读问题的解决

      • 事务隔离级别

        • Read uncommitted (读未提交):以上问题都会发生。
        • Read committed (读已提交):可避免脏读的发生。(Oracle)
        • Repeatable read (可重复读): 可避免脏读、不可重复读,但虚读有可能发生。(MySQL)
        • Serializable (可序列化):可避免脏读、不可重复读、幻读的发生。安全性高,但效率低。
    • hibernate中设置事务的隔离级别

      • 设置事务隔离级别

在没有配置的时候,hibernate默认使用数据库的隔离级别,
mysql默认的隔离级别是repeatable read。
Hibernate的配置文件中可以显式的设置隔离级别。
每一种隔离级别都对应一个整数:
    1:Read Uncommitted 
    2:Read Committed 
    4:Repeatable Read 
    8:Serializable 
设置事务隔离级别:
    在核心配置文件hibernate.cfg.xml中
        <!-- mysql -->
    <property name="hibernate.connection.isolation">4</property>
  • service层事务

    • hibernate解决service的事务管理
      • 改写工具类
        public class HibernateUtils {
        	public static final Configuration cfg;
        	public static final SessionFactory sf;
        	
        	static {
        		cfg = new Configuration().configure();
        		sf=cfg.buildSessionFactory();
        	}
        	
        	public static Session openSession() {
        		return sf.openSession();
        	}
        	
        	public static Session getCurrentSession() {//当前线程绑定的session
        		return sf.getCurrentSession();
        	}
        }

         

      • 配置完成
        	<!-- 设置当前线程绑定的Session -->
        <property name="hibernate.current_session_context_class">thread</property>

         

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值