文章目录
事务概念
事务是一步或几步基本操作组成的逻辑执行单元,这些基本操作作为一个整体执行单元,它们要么全部执行,要么全部取消,绝不能仅仅执行一部分。一般而言,每次用户请求,对应一个业务逻辑方法,一个业务逻辑方法往往具有逻辑上的原子性,应该使用事务。例如一个转账操作,对应修改两个账户的余额,这两个账户的修改要么同时生效,要么同时取消一同时生效是转账成功,同时取消是转账失败,但不可只修改其中一个账户,那将破坏数据库的完整性。
事务特性(ACID)
- 原子性(atomicity): 事务中不可分割最小逻辑执行体
- 一致性(consistency):如果系统运行发生中断,某个事务尚未完成而被迫中断, 而该未完成的事务对数据库所做的修改已被写入数据库, 此时,数据库就处于一种不正确的状态。比如银行在两个账户之间转账:从A账户向B账户转入1000元。系统先减少A账户的1000元, 然后再为B账户增加1000元。如果全部执行成功,数据库处于一致性状态。如果仅执行完A账户金额的修改, 而没有增加B账户的金额,则数据库就处于不一致性状态。 因此,一致性是通过原子性来保证的。
- 隔离性(isolation):事务之间互相不影响。
- 持续性(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