10

事务的含义:

事务可以看作是由对数据库的若干操作组成的一个单元,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求。

事务的一个典型例子是银行中的转帐操作,帐户A把一定数量的款项转到帐户B上,这个操作包括两个步骤,一个是从帐户A上把存款减去一定数量,二是在帐户B上把存款加上相同的数量。这两个步骤显然要么都完成,要么都取消,否则银行就会受损失。显然,这个转帐操作中的两个步骤就构成一个事务。

事务的四个特征(ACID)

1.原子性(Atomicity):指事务中的操作,或者都完成,或者都取消。

2.一致性(Consistency):指事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况,一致性一般会隐含的包括在其他属性之中。

3.隔离性(Isolation):指当前的事务与其他未完成的事务是隔离的。在不同的隔离级别下,事务的读取操作,得到的结果可能是不同的。

4.持久性(Durability):指对事务发出COMMIT命令后,即使这时发生系统故障,事务的结果也被持久化了。与此相反的是,当在事务执行过程中,系统发生故障时,则事务的操作都被回滚,即数据库回到事务开始之前的状态。

如果没有采取必要的隔离机制, 就会导致各种并发问题:

1.更新丢失:
本来是:
1000-200=800
800-300=500
1000更新为500

错误:
1000-200=800
1000-300=700
1000更新为700

2.脏数据:
1000元更新为800元,最后更新为500元。可是读取到的是中间的800元。

3.不可重复读
第一次读取的数据和第二次读取的数据不一致

4.幻读:
第一次读取到了3行数据,然后有人删除了1行数据,读取到的数据变成了2行。

数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题。

不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱。

ANSI SQL标准定义了 4 种事务隔离级别:

image.png

SQL Server支持4中事务隔离级别,默认级别为: READ COMMITTED

尽管让程序自主管理 Session 对象的生命周期也是可行的, 但是在实际Java应用中, 把管理Session对象的生命周期交给 Hibernate管理, 可以简化Java应用程序代码和软件架构。

Hibernate提供了三种管理 Session 对象的方法:
1.Session对象的生命周期与本地线程绑定(我们学的)
记得配置cfg:<property name="current_session_context_class">thread</property>

2.Session对象的生命周期与JTA事务绑定
3.Hibernate委托程序管理Session对象的生命周期

在 Hibernate的配置文件中, current_session_context_class属性用于指定Session管理方式, 可选值包括:
thread: Session对象的生命周期与本地线程绑定
jta: Session对象的生命周期与JTA事务绑定
managed: Hibernate委托程序来管理Session对象的生命周期

安全:一个线程,一个session

当配置为thread时,SessionFactory的getCurrentSession()方法才能使用

当一个线程(threadA)第一次调用 SessionFactory 对象的getCurrentSession() 方法时, 该方法会创建一个新的Session(sessionA) 对象, 把该对象与threadA绑定, 并将sessionA返回

当threadA再次调用SessionFactory对象的 getCurrentSession()方法时, 该方法将返回sessionA对象

当threadA提交sessionA对象关联的事务时,Hibernate会自动清理sessionA对象的缓存, 然后提交事务, 关闭sessionA对象。 当threadA撤销sessionA对象关联的事务时, 也会自动关闭sessionA对象(也就是使用getCurrentSession() 获取session不需要自行关闭)

若threadA再次调用SessionFactory对象的getCurrentSession()方法时, 该方法会又创建一个新的 Session(sessionB)对象, 把该对象与threadA绑定, 并将sessionB返回

可以不用getCurrentSession()方法,用ThreadLocal实现(jdk提供的)

ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,ThreadLocal并不是一个Thread,而是Thread的局部变量。

注意:获取session需要自行关闭。

s_h例子

对于WEB应用,一个请求可能需要多次操作数据库并返回数据至JSP中进行显示,可能有以上两个问题要考虑:
1.多次操作数据库如何共享一个事务?

2.对于懒加载的实体类,返回到JSP页面时若session已关闭,那么就取不到这个实体的数据了,如何处理这类问题?

说明:事务从Service层开始,要取数据的时候,session关闭了,进行不了以下过程。

阐述Session加载实体对象的过程:
① Session在调用数据库查询功能之前,首先会在一级缓存中通过实体类型和主键进行查找,如果一级缓存查找命中且数据状态合法,则直接返回;
② 如果一级缓存没有命中,接下来Session会在当前NonExists记录(相当于一个查询黑名单,如果出现重复的无效查询可以迅速做出判断,从而提升性能)中进行查找,如果NonExists中存在同样的查询条件,则返回null;
③ 如果一级缓存查询失败则查询二级缓存,如果二级缓存命中则直接返回;
④ 如果之前的查询都未命中,则发出SQL语句,如果查询未发现对应记录则将此次查询添加到Session的NonExists中加以记录,并返回null;
⑤ 根据映射配置和SQL语句得到ResultSet,并创建对应的实体对象;
⑥ 将对象纳入Session(一级缓存)的管理;
⑦ 如果有对应的拦截器,则执行拦截器的onLoad方法;
⑧ 如果开启并设置了要使用二级缓存,则将数据对象纳入二级缓存;
⑨ 返回数据对象。

Action用到 Service
Service 用到 DAO

过滤器 用到 HibernateUtil 和 HibernateSessionFactory

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容