hibernate 二级缓存和事务级别详讲

一、概述

这章总的分两大块来讲解

  第一大块,hibernate的事务管理。对于hibernate的事务管理来说,如果之前学过数据库的事务管理,那么在这里就顺风顺水了。如果没学过,第一次遇到,那也没关系,我会详细解释其中的内容。

  第二大块,hibernate的二级缓存机制。这个看起来好高大上啊,如果从来没了解过二级缓存的人肯定觉得他很难,但是学过会发现,真的是so easy。最起码会知道什么是二级缓存,作用是什么。

二、hibernate的事务管理

2.1.1、什么是事务?

   事务是一组业务逻辑,比如A去银行给B转钱,A转了100块给B(update语句更新A的钱减少一百),B收到钱(update语句更新B的钱增加一百),这转钱整个过程称为事务,注意,不要觉得A转钱给B,A做完了操作,就是事务了,要记住事务是一组业务逻辑,两个在一起才是事务。在比如有一个数字5,现在有一个事务A,事务A做的事情就是将5变为4,该事务要做的事情有,拿到5,然后5-1,然后数据库中的5变为了4,这才算这个事务A真正的成功了,可以那么说,业务逻辑太抽象了,事务就是一组操作,只有整个操作在一起才算是一个事务。就向上面说的,转钱也是一个事务,它做的操作就只有两个,A减少钱,B增加钱。

2.1.2、事务的特性ACID

  A(atomicity):原子性:事务不可被划分,是一个整体,要么一起成功,要么一起失败

       C(consistence):一致性,A转100给B,A减少了100,那么B就要增加100,增加减少100就是一致的意思

  I(isolation):隔离性,多个事务对同一内容的并发操作。

  D(durability):持久性,已经提交的事务,就已经保存到数据库中,不能在改变了。

2.1.3、事务隔离性产生的问题

  跟线程安全差不多,多个事务对同一内容同时进行操作,那么就会出现一系列的并发问题。一定要注意,这个是两个或者多个事务同时对一个内容进行操作,是同时,而不是先事务A操作完,然后事务B在操作,这个要理解清楚。

三、乐观锁,悲观锁 的理解

乐观锁

  认为丢失更新一定不会发生,非常乐观,在数据库表中添加一个字段,可以说是标识字段把,用于记录操作次数的,比如如果对有人拿到了该行记录做了更新操作,该字段就加1。然后下一个拿到该记录的人要先将拿到的记录的标识和数据库中该记录的标识做对比,如果一样,则可以修改,并且修改后标识(版本)+1,如果不一样,先从数据库中查询,然后在做更新。

举个例子

  A 查询数据,username = 'jack' ,password = '1234',version=1

  B 查询数据,username="jack", password="1234',version=1  //AB同时拿到数据库中数据,且version读为1

       A 更新密码,用户名不变 username='jack',password='456',version=2  //先和数据库中该行记录的version做对比,拿到 的version 是1,跟数据库中一样,所以能做更新,A将密码更新,version+1,然后将其保存到数据库中(注意,这里写的是       A更新之后的的数据。 不要搞混了。)

  B 更新用户名,username='rose',password='1234',version=1  //B想要更新时,先和数据库中该条记录的版本号做对比,发现不一样,然后查询

       B 重新查询数据, 用户名不变 username='jack',password='456',version=2  //然后在进行对比,这次version一样了,B就可以实现更新操作了。

  更新用户名,username='rose',password='456',version=3  //更新后,version+1 

悲观锁

  认为丢失更新一定会发生,此时采用数据库锁机制,也就是相当于谁操作了该记录行,就会在上面加把锁,别人进不去,有等你操作完之后,该锁就释放,别人就可以操作了。跟那个隔离级别单事务差不多。但是锁也分很多种。

  读锁:共享锁,大家可以一起读数据,但是不能一起操作(更新,删除,插入等)

  写锁:排他锁,只能一个进行写,也就是上面我们说的原理。

四、hibernate的二级缓存

概述

         如果知道了数据库中事务的知识,那么在hibernate中就非常简单,只是简单的配置一下就OK了。所以在hibernate的事务讲解这里篇幅就比较少,重要的还是需要弄懂前面的知识。很重要。

 4.1、什么是二级缓存

    我们知道一级缓存,并且一级缓存的作用范围就在session中,每个session都有一个自己的一级缓存,而二级缓存也就是比一级缓存的作用范围更广,存储的内容更多,我们知道session是由sesssionFactory创建出来的,一个sessionFactory能够创建很多个session,每个session有自己的缓存,称为一级缓存,而sessionFactory也有自己的缓存,存放的内容供所有session共享,也就是二级缓存。 是不是很简单?还不理解看下面我画的一张图就一目了然了。

一级缓存:保存session中,事务范围的缓存(通俗点讲,就是session关闭后,该缓存就没了,其缓存只能在session的事务开启和结束之间使用)

二级缓存:保存在SessionFactory,进程范围内的缓存(进程包括了多个线程,也就是我们上面说的意思,A线程可能拿到一个session进行操作,B线程也可能拿到一个session进行操作,但是A和B读能访问到SessionFactory中的缓存,也就是二级缓存,这里只是拿A,B说事,可能有一个线程刚创建出来session,也能拿到二级缓存中的数据)

好了,就说这么多了

https://www.cnblogs.com/whgk/p/6182742.html

猜你喜欢

转载自blog.csdn.net/nameIsHG/article/details/83444957
今日推荐