`

hibernate学习笔记第8讲-session_flush-数据库隔离级别

阅读更多

 

Session  flush:

默认在commit之前执行flush

Session  flush方法主要做了两件事

           1清理缓存

           2 执行sql

Session flush 在什么时候执行:

           1 默认在事务提交commit

           2, 显示调用。

     3 在执行查询前,如 iterate

hibernate按照save(insert),updatedelete顺序提交相关操作

 

 

数据库隔离级别:


 

大部分数据库采用 read commited

Mysql 默认采用repeatable read

脏读:事务还没提交,就可以读到,此时如果事务回滚,就出现脏数据。

不可重复读:第一次读的为A,之后另一个人修改为B,此时再读,显示为B,与第一次读的不同,出现不可重复读。解决办法:在第一次读的时候锁住该条记录,别人修改不了。

幻读:第一次查询读出5条数据,之后别人添加记录,当第二次读的时候,变成10条记录。此时为幻读。

 

 

/**

 * 测试uuid主键生成策略

 */

tx = session.beginTransaction();

                    User1 user = new User1();

                    user.setName("李四");

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

//因为user的主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理

//不会发出insert语句,但是id已经生成,sessionexistsInDatebase状态为false

                    session.save(user);

                   

                    //调用flushhibernate会清理缓存,执行sql

//如果数据库的隔离级别设置为为提交读,那么我们可以看到flush过的数据

                    //并且sessionexistsInDatebase状态为true

                    session.flush();

                   

                    //提交事务

//默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush

                    //commit后数据是无法回滚的

                    tx.commit();

 

 

/**

 * 测试native主键生成策略

 */

 

tx = session.beginTransaction();

 

                    User2 user = new User2();

 

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

                    //因为user的主键生成策略为native,依赖于数据库的主键生成策略,只有执行了sql,数据库才会生成id,所以调用session.save后,将执行insert语句,返回有数据库生成的id

                    //纳入了session的管理,修改了sessionexistsInDatebase状态为true

                    //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据

                    session.save(user);

                    tx.commit();

 

/**

 * 测试uuid主键生成策略, evict()

 */

 

tx = session.beginTransaction();

                    User1 user = new User1();

                    user.setName("王五");

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

                     //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理

//不会发出insert语句,但是id已经生成,sessionexistsInDatebase状态为false

                    session.save(user);

                   

                    //user对象从session中逐出,即sessionEntityEntries属性中逐出

                    session.evict(user);

                  

                    //无法成功提交,因为hibernate在清理缓存时,在sessioninsertions集合中取出user对象进行insert操作后需要更新entityEntries属性中的existsInDatabasetrue,而我们采用evict已经将usersessionentityEntries中逐出了,所以找不到相关数据,无法更新,抛出异常

                    tx.commit();

 

 

/**

 * 测试uuid主键生成策略,解决evict()

 */

 

tx = session.beginTransaction();

                    User1 user = new User1();

                    user.setName("王五");

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

                    //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理,不会发出insert语句,但是id已经生成,sessionexistsInDatebase状态为false

                    session.save(user);

                   

                    //flushhibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象清除,并且设置sessionexistsInDatebase的状态为true

                    session.flush();

                   

                    //user对象从session中逐出,即sessionEntityEntries属性中逐出

                    session.evict(user);

                   

                    //可以成功提交,因为hibernate在清理缓存时,在sessioninsertions集合中无法找到user对象,所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态

                    tx.commit();

/**

 * 测试native主键生成策略,evict()

 */

 

tx = session.beginTransaction();

                    User2 user = new User2();

                    user.setName("张三11");

                    user.setPassword("123");

                    user.setCreateTime(new Date());

                    user.setExpireTime(new Date());

                   

                    //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id

                    //纳入了session的管理,修改了sessionexistsInDatebase状态为true

                    //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据

                    session.save(user);

                   

                    //user对象从session中逐出,即sessionEntityEntries属性中逐出

                    session.evict(user);

                   

                    //可以成功提交,因为hibernate在清理缓存时,在sessioninsertions集合中无法找到user对象

                    //所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态

                    tx.commit();

 

/**

 * 测试assigned主键生成策略,执行sql顺序

 *

 */

 

tx = session.beginTransaction();

                    User3 user = new User3();

                    user.setId("001");

                    user.setName("张三");

                   

                    session.save(user);

                   

                    user.setName("王五");

                   session.update(user);

                   

                    User3 user3 = new User3();

                    user3.setId("002");

                    user3.setName("李四");

                    session.save(user3);

                   

                    //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

                    //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

                    //Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?

                    //hibernate按照save(insert),updatedelete顺序提交相关操作

                    tx.commit();

 

/**

 * 测试assigned主键生成策略,执行sql顺序

 *

 */

 

tx = session.beginTransaction();

                    User3 user = new User3();

                    user.setId("003");

                    user.setName("张三");

                   

                    session.save(user);

                   

                    user.setName("王五");

                    session.update(user);

                   

                    session.flush();

                   

                    User3 user3 = new User3();

                    user3.setId("004");

                    user3.setName("李四");

                    session.save(user3);

                   

                    //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

                    //Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?

                    //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)

                    //因为我们在session.udpate(user)后执行了flush,所以在清理缓存时执行flush前的sql不会生成

                    //sql会按照我们的意愿执行

                    tx.commit();

  • 大小: 19.3 KB
分享到:
评论

相关推荐

    Hibernate的Session_flush与隔离级别代码详解

    主要介绍了Hibernate的Session_flush与隔离级别代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    mysql-test-5.7.22-linux-glibc2.12-x86_64.tar.gz

    FLUSH PRIVILEGES; 10、设置开机自启 cd /usr/local/mysql/mysql-5.7.22/support-files cp mysql.server /etc/init.d/mysql chmod +x /etc/init.d/mysql chkconfig --add mysql chkconfig --list ...

    First Part - Copy_.zip_flush_dwg_

    dwg file representing a flush door nice autocad 2019 file

    hibernate学习笔记

    Hibernate 学习笔记 Hibernate 学习笔记 1 第一个hibernate项目(hibernate_first) 2 测试实体对象的生命周期(hibernate_session) 3 hibernate基本映射(hibernate_basemapping) 4 class实体类---表 4 标签id 5 ...

    mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz

    此时就可以成功进入数据库了。 修改密码:输入use mysql;然后更改密码: update user set password=password("123456") where user="root";//旧版本 update user set authentication_string=password("123456") ...

    DPDK_SURICATA-4_1_1:用于软件加速的dpdk基础结构。 目前正在研究RX和ACL预过滤器

    添加了4种tx_buffer_flush模式-0:无,1:4、2:8、3:16 对重组后的数据包实施SW或HW对称散列。 将dpdk配置移到suricata.yaml 允许多名工人,而不是单名工人 允许带有RSS的多个RX队列(默认) 将dpd

    mysql-8.0.20-macos10.15-x86_64.tar.gz

    Your MySQL connection id is 8 Server version: 8.0.20 Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its ...

    Hibernate学习笔记

    002 第一个 Hibernate 示例 003 hibernate 主要接口介绍 004 持久对象的生命周期介绍 005 query 接口初步 006 开源 O/R 映射框架内容回顾 007 Hibernate 基本映射标签和属性介绍 008 多对一 关联映射 009 一对一 ...

    hibernate的session.flush

    博文链接:https://llying.iteye.com/blog/221702

    hibernate操作数据库笔记

    使用Hibernate的Session对象操作数据库 1.初始化Hibernate:在要使用Hibernate的类的方法中实例化Configuration对象并用Configuration对象的configure()方法将hibernate.cfg.xml中的配置加载到内存,即: ...

    IRPTrace2.00.002.zip

    IRPTrace2.00.002.zip ,IRP跟踪工具,支持Windows7。 IRPTrace 2.00.002, Build Date September 23... IRP_MJ_FLUSH_BUFFERS + N/A N/A IRP_MJ_QUERY_VOLUME_INFORMATION + + + IRP_MJ_SET_VOLUME_INFORMATION + - ...

    深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)

    注意:ob_flush()和flush()这两个函数一般要一起使用,顺序是先ob_flush(),然后flush(),它们的作用是刷新缓冲区。这里具体的说下什么时候要用到刷新缓冲区和为什么要刷新缓冲区。 一、什么时候要刷新缓冲区 当...

    flash-plugin-11.2.202.438-release.x86_64.rpm

    flash-plugin-11.2.202.438-release.x86_64.rpm

    hibernate_flush 深入了解

    NULL 博文链接:https://wuhaidong.iteye.com/blog/766562

    基于HTML爬虫的豆瓣小组API(Python版本).zip

    - flush - json <url> <method> <params> - load - login <username> - logout - persist - req <url> <method> <params> <data> - toJSON - to_xml <content> - use - xml <url> <method> ...

    io-flush-test.zip_flush

    this is a i/o flush code running on windows

    优化LittleVGL驱动接口函数 disp_flush

    华芯微特SWM32SRET6集成了TFT和内部的SDRAM,但是没有硬件加速单元,TFT没有硬件加速单元,而且无法使用DMA传输,这点太窝火了,LittleVGL驱动接口部分,只能使用纯软件打点,占用CPU资源,而且由于只能字访问SDRAM...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    ortp wince

    rtp_session_flush_sockets rtp_session_resync rtp_session_set_remote_addr_and_port rtp_session_resync rtp_session_set_time_jump_limit copymsg rtp_session_enable_jitter_buffer rtp_session_...

    8-07-14_MegaCLI for linux_windows

    MegaRAID SAS 9270-8i MegaRAID SAS 9271-4i MegaRAID SAS 9271-8i MegaRAID SAS 9271-8iCC MegaRAID SAS 9286-8e MegaRAID SAS 9286CV-8e MegaRAID SAS 9286CV-8eCC MegaRAID SAS 9265-8i MegaRAID SAS 9285-...

Global site tag (gtag.js) - Google Analytics