zoukankan      html  css  js  c++  java
  • day37 06-Hibernate二级缓存:更新时间戳区

    二级缓存区:类缓存区,集合缓存区,更新时间戳区.

    它会记录一个时间T1.其实在我们查询之后它会记录一个时间.假设时间叫做T1.就是你查询完之后的当前时间是T1.当我们自己手动在下面做了一个更新之后,它会在更新时间戳的区域中去记录一个你更新这条记录的时间T2.

    另开一个事务,又要去做查询了,从我们二级缓存中去获取数据.一获取数据的时候它就会先比对这个时间戳.如果T2>T1,说明你是先查询后更新.如果是后更新的话,那我的数据就不是最新的了.如果不是最新的它强制地又发送了一个SQL语句查询我们最新的记录.为了找到最新的记录,它就这样去做了.这其实就是它的更新时间戳区域,就记一时间戳.

    @SuppressWarnings("unused")
        @Test
        // 更新时间戳
        public void demo8(){
            Session session = HibernateUtils.getCurrentSession();
            Transaction tx = session.beginTransaction();
            
            Customer customer = (Customer) session.get(Customer.class, 2);
            //customer.setCname("xx");//不能这样做,因为一级缓存区的更新自动同步到二级缓存
            session.createQuery("update Customer set cname = '奶茶' where cid = 2").executeUpdate();//调用executeUpdate()才可以执行更新
            //但是这种不建议你去使用.那我们为什么这样去玩呢?因为你这样去玩二级缓存它不知道啊。你采用这种方式二级缓存不知道你在做更新.要是你采用set属性值那种方式更新
            //二级缓存那边就同步了
            //hql主要是用来查询,如果你想用它来做修改的话也是可以的,包括插入删除.
            tx.commit();
            
            session = HibernateUtils.getCurrentSession();
            tx = session.beginTransaction();
            
            Customer customer2 = (Customer) session.get(Customer.class, 2);//这边得到的数据是新的吗?得到的是美眉还是奶茶啊?
            //如果没有执行上面的update语句进行更新这里就不会发SQL.这里又发SQL查了一遍.那它怎么知道这里面是更新过的记录呢?这就跟更新时间戳区有关.
            //
            tx.commit();
        }

  • 相关阅读:
    Tips(持续跟新)
    icpc 2018 徐州 网络赛 B 博弈+记忆化搜索
    2018 徐州 icpc 网络赛 A 递推or数学公式
    2018 徐州icpc网络赛 G 分块
    HDU 3092 Least common multiple(完全背包+思维)
    hdu 4747(DP?线性递推)
    Pell-方程学习小结
    C++中map的介绍用法以及Gym题目:Two Sequences
    求最长上升子序列和最长非下降子序列
    dfs+枚举,flip游戏的拓展POJ2965
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6709876.html
Copyright © 2011-2022 走看看