Hibernate 5.3 (九)

本文介绍了Hibernate中的事务概念及其ACID特性,强调了Session与事务的关系,包括线程安全性和长事务处理策略。此外,还详细阐述了Hibernate的上下文相关Session管理和事件机制,包括拦截器和事件监听器的使用,帮助读者深入理解Hibernate的事务管理和扩展性。
摘要由CSDN通过智能技术生成

事务概念

事务是一步或几步基本操作组成的逻辑执行单元,这些基本操作作为一个整体执行单元,它们要么全部执行,要么全部取消,绝不能仅仅执行一部分。一般而言,每次用户请求,对应一个业务逻辑方法,一个业务逻辑方法往往具有逻辑上的原子性,应该使用事务。例如一个转账操作,对应修改两个账户的余额,这两个账户的修改要么同时生效,要么同时取消一同时生效是转账成功,同时取消是转账失败,但不可只修改其中一个账户,那将破坏数据库的完整性。

事务特性(ACID)

  1. 原子性(atomicity): 事务中不可分割最小逻辑执行体
  2. 一致性(consistency):如果系统运行发生中断,某个事务尚未完成而被迫中断, 而该未完成的事务对数据库所做的修改已被写入数据库, 此时,数据库就处于一种不正确的状态。比如银行在两个账户之间转账:从A账户向B账户转入1000元。系统先减少A账户的1000元, 然后再为B账户增加1000元。如果全部执行成功,数据库处于一致性状态。如果仅执行完A账户金额的修改, 而没有增加B账户的金额,则数据库就处于不一致性状态。 因此,一致性是通过原子性来保证的。
  3. 隔离性(isolation):事务之间互相不影响。
  4. 持续性(durability):也称之为持久性,事务一旦提交,就保存到数据库。

Session与事务

Tip

线程安全:在多线程使用该对象的时候,底层是通过锁机制去保证,每次只有一个对象执行。
线程不安全:在多线程使用该对象的时候,多个线程对同时执行,会出现逻辑错乱。

SessionFactory 对象的创建代价很高,它是线程安全的对象,被设计成可以被所有线程所共享。通常,SessionFactory 会在应用程序启动时创建,一旦创建 了SessionFactory 将不会轻易关闭, 只有当应用退出时才关闭SessionFactory。

Session对象是轻量级的,它也是线程不安全的。下面是比较的方法去获取session:

public static final ThreadLocal<Session> session
		= new ThreadLocal<Session>();

	public static Session currentSession()
		throws HibernateException
	{
		Session s = session.get();
		// 如果该线程还没有Session,则创建一个新的Session
		if (s == null)
		{
			s = sessionFactory.openSession();
			// 将获得的Session变量存储在ThreadLocal变量session里
           // 相当于每一个线程都绑定一个session,你每次线程来拿的时候,都用自己的线程的s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值