Hibernate的事务管理

数据库事务
数据库的事务指的是把一系列的数据库操作组成一个单元,这个单元中的所有操作,这些操作要么全部完成,要么全部取消。

 

事务的特性(acid)

数据库事务必须具备ACID特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。

原子性:一个事务是有一个单元组成的,这个单元包含对数据库的若干个操作,而这些操作,要么全部成功,如果有一个失败,所有的操作全部取消,恢复到初始状态.


一致性:指数据库事务不能破坏关系数据的完成性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中用户A和用户B的存款总额相等.

隔离性:指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间,不进行相互干扰。

持久性:指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

编程式与声明式事务:

编程(Programmatical)式
声明式(Declarative)

 

 

事务的隔离级别
       企业级的数据库每一秒钟都可能应付成千上万的并发访问,因而带来了并发控制的问题。由数据库理论可知,由于并发访问,在不可预料的时刻可能引发如下几个可以预料的问题:

  脏读:包含未提交数据的读取。例如,事务1 更改了某行。事务2 在事务1 提交更改之前读取已更改的行。如果事务1 回滚更改,则事务2 便读取了逻辑上从未存在过的行。

  不可重复读取:当某个事务不止一次读取同一行,并且一个单独的事务在两次(或多次)读取之间修改该行时,因为在同一个事务内的多次读取之间修改了该行,所以每次读取都生成不同值,从而引发不一致问题。
   

      第二类丢失更新:是不可重复读的一种特例,如上,乙不做第二次查询而是直接操作完成,帐户内最终为100元,甲的操作被覆盖掉了,银行损失100元。感觉和第一类丢失更新类似。
  幻象:通过一个任务,在以前由另一个尚未提交其事务的任务读取的行的范围中插入新行或删除现有行。带有未提交事务的任务由于该范围中行数的更改而无法重复其原始读取。

事务隔离级别:

Read Uncommitted:

  • 更新丢失(false)
  • 脏读(true)
  • 不可重复读(true)
  • 幻读(true)


Read Committed:

  • 更新丢失(false)
  • 脏读(false)
  • 不可重复读(true)
  • 幻读(true)

Repeatable Read:

  • 更新丢失(false)
  • 脏读(false)
  • 不可重复读(false)
  • 幻读(true)

Serializable:

  • 更新丢失(false)
  • 脏读(false)
  • 不可重复读(false)
  • 幻读(false)

Hibernate 中的事务

 

 

 Hibernate中事务管理API

org.hibernate.Transaction
Commit()
Rollback()

 

锁:

ibernate当中,从宏观的角度设置数据库的不同的事务隔离级别来控制事务之间的并发执行。
微观角度,使用乐观锁或者悲观锁进一步对事务进行细化的并发控制

悲观锁
悲观锁(Pessimistic Locking),悲观的认为每次读取或者修改数据库时,其它的事务也在并发访问相同的数据

 

 

 

Transaction tx = session.beginTransaction();
Query query = session.createQuery("from Testbook tb");
query.setLockMode("tb",LockMode.UPGRADE);
List<Testbook> list=query.list();
tx.commit();

 

 

 

 

 Session对象的lock()方法设置悲观锁

 

Transaction tx=session.beginTransaction();
Testbook tb=(Testbook)session.get(Tsetbook.class,new Integer(1));
session.lock(tb,LockMode.UPGRADE);
tx.commit();

 

或者

  

Transaction tx=session.beginTransaction();
Testbook tb=(Testbook)session.get(Tsetbook.class,new Integer(1),LockMode.UPGRADE);
tx.commit();

 

 乐观锁
乐观锁,乐观的认为数据库中的数据很少发生同时被操作的问题。实现上,乐观锁可以通过数据的版本号(Version)比较机制实现

平衡应用系统的性能和数据一致性之间的矛盾,实际开发中,可以在数据库中设定隔离级别为ReadCommited,然后在程序中,在需要锁定的代码上面实现乐观锁定

 

版本号方式实现乐观锁:

 

public class Testbook implements java.io.Serializable{
	//用来记录版本号,不需要提高getter与setter方法
	private Interger version;
}

 

<class name="com.rbh.examples.Testbook" table="TESTBOOK" 
optimistic-lock="version">
<id name="id" type="java.lang.Integer"></id>
<version name="version" column="version" access="field"/>

  

时间戳实现乐观锁:

 

public class Testbook implements java.io.Serializable{
	private java.sql.Timestamp updateTime;
}

 

<class name="com.rbh.examples.Testbook" table="TESTBOOK">
	<id name="id" type="java.lang.Integer"></id>
	<timestamp name="updateTime" column="update_time" 

access="field">

  

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值