hibernate_事务处理、session管理

6.8.2:Session与事务 Hibernate的事务( Transaction对象 )通过Session的beginTransaction( )方法显式打开,Hibernate自身并不提供事务控制行为(没有添加任何附加锁定行为),Hibernate底层直接使用JDBC连接、JTA资源或其他资源的事务。 Hibernate只是对底层事务进行了抽象,让应用程序可以直接面向Hibernate事务编程,从而将应用程序和JDBC连接 阅读详情

 所谓的事务就是指逻辑上的一组操作,这个操作要么全都成功,要么全都失败。

1. 事务的特性

事务特性说明
原子性事务的逻辑操作是一个单位,不可被分割。
一致性事务的执行前后,数据完整性要保持一致。
隔离性一个事务在执行的过程中不受到其他事务的干扰。
持久性一旦事务结束,数据就永久保存数据库。

 
2.并发操作引发的读问题

  • 脏读
     所谓的脏读就是指一个事务读到另一个事务未提交的数据。
  • 不可重复读
     所谓的不可重复读就是指一个事务读到另一个已经提交数据(update),导致查询结果不一样。
  • 虚读
     所谓的虚读就是一个事务读到另一个事务已经提交的数据(insert),导致查询结果不一样。
    解决方法:设置事务的隔离级别,然后在hibernate中设置事务的隔离级别。
//在核心配置文件中设置,X的取值为 1、2、4、8(对应隔离级别)
<property name="hibernate.connection.isolation">
    X
</property>
隔离级别隔离级别名称作用
1Read uncommitted isolation(未提交读)以上问题都不能解决
2Read committed isolation(已提交读)只能避免脏读
4Repeatable read isolation(重复读)能够避免脏读和不可重复读
8Serializable isolation(串行)能够解决以上三种问题

 
3. 并发操作引发的写问题
 并发操作的时候,很经常会引发丢失更新。为了避免这一情况,解决的方法有乐观锁和悲观锁两种机制。

  • 悲观锁(排它锁)
     悲观锁又称之为排它锁,这是数据库自带的一种锁机制,它解决丢失更新的方法是在操作的时候获取锁,在操作完成后释放锁,在操作过程中,别的事务无法获取到锁。简而言之就是:A事务在进行更新操作的时候,B事务无法进行更新操作。
//在获取Session后,在事务上设置悲观锁
Customer customer = (Customer) session.get(Customer.class, 3, LockMode.UPGRADE);
  • 乐观锁
    所谓的乐观锁是在数据库增加某一个字段(Integer类型),以这个字段作为标识,在进行更新的时候进行对比字段是否相同,如果不相同,更新就失败了。如果相同,则提交事务,并且在字段+1
//找到映射文件,在映射文件中将这个字段进行设置,比如Customer中的ver字段作为标识,那么在Customer中进行一下配置
//在class标签下,进行设置version标签
<version name="ver" />

4. session管理
我们在操作事务的时候,经常会遇见两个小事务组成的一个个事务。如果这两个小事务使用的session不是同一个的话,会导致回滚的时候,只有一个小事务回滚。这就要求我们用的session必须是同一个。

//在核心配置文件中设置,在标签hibernate-configuration下的标签session-factory下的子标签property中进行如下设置

<!-- 使用当前线程中的session -->
<property name="hibernate.current_session_context_class">
    thread
</property>
//如果没有在核心文件中配置session管理,那么以下两个session是不相同的:
Session session1 = sessionFactory.openSession();
Session session2 = sessionFactory.openSession();

//结果为false,两个session不是同一个
session1 == session2


//如果在核心配置文件中设置了session管理,那么以下两个session就是相同的。
Session session1 = sessionFactory.getCurrentSession();
Session session2 = sessionFactory.getCurrentSession();

//结果为true,两个session是同一个
session1 == session2

5. 本地线程session过程详解
 <1>绑定线程
当一个线程(threadA)第一次调用 SessionFactory 对象的 getCurrentSession() 方法时, 该方法会创建一个新的 Session(sessionA) 对象, 把该对象与 threadA 绑定, 并将 sessionA 返回。

 <2>返回线程session
当 threadA 再次调用 SessionFactory 对象的 getCurrentSession() 方法时, 该方法将返回 sessionA 对象

 <3>session提交事务
当 threadA 提交 sessionA 对象关联的事务时, Hibernate 会自动清理 sessionA 对象的缓存, 然后提交事务, 关闭 sessionA 对象. 当 threadA 撤销 sessionA 对象关联的事务时, 也会自动关闭 sessionA 对象

 <<4>提交后再使用线程session的情况
若 threadA 再次调用 SessionFactory 对象的 getCurrentSession() 方法时, 该方法会又创建一个新的 Session(sessionB) 对象, 把该对象与 threadB绑定, 并将 sessionB 返回

 特别注意:当前线程中的session不需要进行关闭,线程结束后自动关闭!!!

Hibernate框架入门与实践教程 本文还有配套的精品资源,点击获取 简介:Hibernate1.rar是一个包含了Hibernate教程和相关库文件的压缩包,专为Java开发者设计。通过实例代码和详细的教程,学习者可以深入理解Hibernate的操作,包括实体类的创建、配置文件的设置、Session管理和事务处理等。压缩包中还包含了必要的jar包和配置文件,以及可能的示例代码、数据库脚本和测试用例。通过学习... 阅读详情

相关推荐

mysql 计算不同胜率的活跃玩家的次日,3日,7日留存率

它根据每天的日期(logymd)和最高段位(max_rank)、胜率段落(win_rate_segment)进行分组,并计算总玩家人数(total_players)、第二天的留存人数(next_day_players)、第三天的留存人数(day3_players)和第七天的留存人数(day7_players)。注意:不是新手留存,是段位活跃玩家留存;最终的结果则是将留存数据进行展示,按照日期(date)、最高段位(rank_level)、胜率段落(win_rate_segment)进行排序。

weixin_42698221的博客 1836

Hibernate学习笔记8,session管理,事务控制

Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰。作为一名软件设计师,必须了解事务并合理利用,以确保数据库保存正确、完整的数据。数据库向用户提供保存当前程序状态的方法,叫事务提交(commit);当事务执行过程中,使数据库忽略当前的状态并回到前面保存的状态的方法叫...

小辣鸡的博客 554

深入理解命名实体识别(NER)

命名实体识别(NER,Named Entity Recognition)是自然语言处理(NLP)中的一项重要技术,用于从文本中识别出特定类型的实体,并将这些实体分类到预定义的类别中。实体通常包括人名、地名、组织名、日期、时间、数量、货币等。例如,在句子“Barack Obama was born in Hawaii in 1961”中,NER任务的目标是识别“Barack Obama”作为人名,“Hawaii”作为地名,以及“1961”作为日期。

AngelCryToo的专栏 4642

Mybatis SqlSessionTemplate优点

SqlSessionTemplate    SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate将会...

www.iokay.cn 1872

2.1 SRv6 TE Policy

SRv6 TE Policy是在SRv6技术基础上发展的一种新的隧道引流技术。SRv6 TE Policy路径表示为指定路径的段列表(Segment List),称为SID列表(Segment ID List)。每个SID列表是从源到目的地的端到端路径,并指示网络中的设备遵循指定的路径,而不是遵循IGP计算的最短路径。如果数据包被导入SRv6 TE Policy中,SID列表由头端添加到数据包上,网络的其余设备执行SID列表中嵌入的指令。

m0_70976024的博客 1237

[UVM]UVM TLM2.0简介及应用实例分析

本文介绍了TLM2.0在UVM中的实现与应用。TLM2.0作为SystemC模型间的核心传输机制,相比TLM1.0提供了更丰富的特性,包括双向阻塞/非阻塞接口、时间标记和统一数据包。文章详细解析了TLM2.0在UVM中的接口实现方式,包括socket类型定义、数据传输机制以及时间标记处理。通过一个具体实例,展示了如何在UVM组件中使用TLM2.0的initiator和target socket进行数据传输,并说明了标准数据包格式和精确时间标记的优势。最后指出TLM2.0在UVM中的实现主要是为了与Syste

元直的博客 5398

java动态代理的简单使用

1 jdk原生动态代理 Proxy:Proxy是所有的动态代理的父类,它提供了一个静态方法来创建动态代理的class对象和实例; InvocationHandler:每一个动态代理都有一个关联的InvocationHandler,在代理实例上调用方法时,方法调用将被转发到InvocationHandler.invoke方法; 简单实例: 需要被代理的类实现的接口 public interface OrderService { boolean save(); } 需要被代理的类的实现 pub

磊杰的博客 410

Dify知识库文档批量下载神器:一键导出所有文件到本地

在使用Dify进行知识库管理的过程中,我们经常遇到一个实际问题:如何将已上传到知识库中的文档批量下载到本地?目前Dify的管理界面虽然功能强大,但暂时没有提供直接的UI界面来批量导出或下载知识库内的文档。这意味着如果我们需要将知识库中的文件备份到本地或进行离线处理,只能通过API接口来实现。本文将详细介绍如何利用Dify的REST API构建一个完整的知识库文档下载解决方案,这也是目前实现知识库文件批量下载到本地的唯一可行路径。🎉进入大模型应用与实战专栏 | 🚀查看更多专栏内容首先,我们需要在Dify的

羊城迷鹿的博客 3473

Hibernate|Hibernate5.4用户指南(八)之事务和并发控制-Transactions and concurrency control

Hibernate用户指南(八)事务和并发控制

白衬衫猿 1101

Multisim14.0仿真应用设计(十六)74LS138译码器应用仿真

74LS138为3线-8线译码器。

zhusl6688的博客 2982

uniapp [全端兼容] - 实现大文件上传分片/切片+本地选择文件上传超大文件,大文件切片上传+断点续传+上传进度条+失败自动重传,支持单个/批量上传图片、视频、文档各种文件(App、小程序、H5

uniapp 分片 断点续传 大文件上传。uniapp大文件切片上传,uniapp实现大文件上传 分片上传 进度条,分片上传附件,实现大文件上传,实现分片大文件上传,Uniapp实现大文件上传 分片上传 进度条,uniapp文件分片上传,uniapp如何上传很大的文件,在选择文件后,按指定大小将文件切割成独立的文件片,并逐片上传,uniapp 微信小程序上传大文件如何切片,uniapp APP实现大文件分片上传、断点续传、秒传,解决大文件上传问题,大文件上传如何做断点续传,uniapp上传视频,Uniapp

🏆 前端领域优质创作者 1万+

open session and Hibernate事务处理机制

原文地址:http://www.cnblogs.com/eafy/archive/2008/09/26/1299700.html 在没有使用Spring提供的Open Session In View情况下,因需要在service(orDao)层里把session关闭,所以laz

pittzhangswing的专栏 548

Python调用CANoe

我们可以创建CANoe应用程序对象,打开配置文件,启动模拟,发送和接收消息,并在完成后关闭CANoe应用程序。这使得我们能够使用Python自动化执行测试任务,并集成CANoe的功能到我们的Python应用程序中。CANoe是一款功能强大的汽车网络仿真和测试工具,它能够模拟和分析汽车网络通信,并提供丰富的测试功能。通过Python编程语言,我们可以方便地调用CANoe的API,实现自动化测试和集成CANoe的功能到我们的Python应用程序中。在CANoe中,我们可以为不同的汽车网络创建配置文件。

AzqLinux的博客 1288

hibernate事务处理

 hibernate事务处理Hibernate是对JDBC的轻量级对象封装,Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装,下面我们详细的分析:   Hibernate可以配置为JDBCTransaction或者是JTATransactio

3708

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Hibernate中的事务处理流程详解

一、Hibernate操作的基本流程 使用 Hibernate 进行数据持久化操作,通常有如下步骤: 1、编写持久化类: POJO + 映射文件 2、获取 Configuration 对象 3、获取 SessionFactory 对象 4、获取 Session,打开事务 5、用面向对象的方式操作数据库 6、关闭事务,关闭 Session 二、配置文件hibernate.cf

想作会飞的鱼的博客 1711

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Hibernate session关闭策略

Hibernate中session是使用最频繁的对象,我们需要对session进行有效管理,即在执行数据库操作前打开session,在执行操作后关闭session。 对session的管理有两种场景: 1) 没有和Spring集成,我们自己管理 我们调用Hibernate的sessionFactory.openSession()方法,...

bto310 443

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Service层进行事务管理,Dao层获得session进行事务处理抛异常的情况

1.  spirng中配置service层的事务管理        在一个web项目中,如果使用SSH框架,一般在spring中配置事务管理。我们一般不会在dao层使用transaction,事务被配置在service层上更为合理,因为业务层方法表示逻辑上的一个原子操作。          spring中配置service层的事务管里,配置文件中的配置如下:               

ADUIT 2669

Hibernate Session

public interface Session extends SerializableJava应用程序与Hibernate之间的主要运行时接口。它是抽象了持久化服务概念的核心抽象API类。Session的生命周期绑定在一个物理的事务(tansaction)上面。(长的事务可能跨越多个数据库事物。)Session的主要功能是提供对映射的实体类实例的创建,读取和删除操作。实例可能以下面三种状态

姚博文的专栏 530

Hibernate Session中文Javadoc

Hibernate早已成为java社区ORM的事实标准,使用者众多。在Hibernate中,数据的增删改查以及数据库连接、事务等都是通过Session接口来操作,因此可以认为Session是整个Hibernate的中心枢纽。使用Hibernate时间久了,有时候都忘了程序是怎么跟数据库进行交互的了,这可不应该,趁最近有时间,得赶紧温习一下。 先从翻译Hibernate Session的Jav

Fairy的专栏 1076

Hibernate的事务处理机制和flush方法的用法

关于在使用hibernate在提交事务时常遇到的异常: an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) net.sf.hibernate.AssertionFailure: po...

dongfangbubai1012的博客 219

Hibernate学习二 session

Hibernate之session Session 用于获取与数据库的物理连接。 Session 对象是轻量级的,并且设计为在每次需要与数据库进行交互时被实例化。持久态对象被保存,并通过 Session 对象检索找回。 该 Session 对象不应该长时间保持开放状态,因为它们通常不能保证线程安全,而应该根据需求被创建和销毁。Session 的主要功能是为映射实体类的实例提供创建,读取和删除操...

cacacai 203

Spring对Hibernate的简化

Hibernate的持久层访问必须按如下步骤进行: (1)创建Configuration实例 (2)创建SessionFactory实例 (3)创建Session实例 (4)打开事务 (5)开始持久化访问 (6)提交事务 (7)如果遇到异常,回滚事务 (8)关闭Session 在HQL查询一节,已经采用HibernateUtils工具类封装部分过程。但依然不够简洁,需要通过代码显式地打开Sessi...

冷血封情 556

Hibernate的Session和transaction

hibernate执行流程: session:一次会话 可以理解session:操作数据库的对象 session与connection关系,多对一的关系   说明使用同一个connection 详情: 1、获取 openSession()getCurrentSession() 区别: 1 getCurrentSession(使用现有的对象)创建的sessio

zucker 1155

Hibernate之session

Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用。 开启Session Session实例由SessionFactory开启获得,例如: Configur

sun Andy Blog 521

Hibernate session

Hibernate session 2016-03-09 15:46 112人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: Java(75) 作者同类文章X Java/J2EE(30) 作者同类文章X Session 用于获取与数据库的物理连接。 Sessio

LH9898的博客 328

Hibernate session的方法的一些说明

用Hibernate肯定会频繁的用到session,下面就将Hibernate session中一些经常的用方法逐个的解释一下。     [c-sharp] view plaincopy Transaction beginTransact               开始一个工作单元并返回一个与之相关Transaction对象,最为事务的开始,通...

PinkLady67 184
上一篇: hibernate_抓取策略-检索配置
下一篇: jQuery_ajax返回json后无法执行success
pseudonym_
博客等级 码龄10年 88粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值