Hibernate事务使用

1、事务的定义

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元。
事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

2、数据库的ACID特征

[list]
[*] Atomic(原子性):指整个数据库事务是不可分割的工作单元。
[*] Consistency(一致性):指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
[*] Isolation(隔离性):指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
[*] Durability(持久性):指的是只要事务成功结束,它对数据库所作的更新就必须永久保存下来。
[/list]

3、数据库系统支持的两种事务模式

[list]
[*]自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。
[*]手动提交模式:必须由数据库客户程序显示指定事务开始边界和结束边界。
[/list]

4、数据库的锁

[list]
[*]x锁 排他锁 被加锁的对象只能被持有锁的事务读取和修改,其他事务无法在该对象上加其他锁,也不能读取和修改该对象
[*]s锁 共享锁 被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加s锁。
[/list]

5、数据库的事务隔离级别


[list]
[*]Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新。
[*]Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。(其他事务可以新插入记录,但是不能更新已有记录)
[*]Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。(其他事务可以新插入记录,也可以更新已有记录)
[*]Read Uncommitted(读未提交数据):一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。
[/list]

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
数据库一般默认Read Commited(读已提交数据)

6、乐观锁和悲观锁

当数据库系统采用read Commited隔离级别时,会导致不可重复读和第二类丢失更新的并发问题,可以在应用程序中采用悲观锁或乐观锁来避免这类问题。
[list]
[*]悲观锁:指在应用程序中显式的为数据资源加锁。尽管能防止丢失更新和不可重复读这类并发问题,但是它会影响并发性能,因此应该谨慎地使用。

在应用程序中显式指定采用数据库系统的独占锁来锁定数据资源。SQL语句:select ... for update,在Hibernate中使用get,load时如session.get(Account.class,new Long(1),LockMode,UPGRADE)

[*]乐观锁:乐观锁假定当前事务操作数据资源时,不回有其他事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用程序采用版本控制手段来避免可能出现的并发问题。
[/list]

7、场景1

假如数据采集服务器不断进行更新数据库的网元信息表操作,有一个统计SQL,需要全表扫面网元信息表,
1.更新SQL对网元信息表的某些行上了排它锁X;
2.统计SQL试图对网元信息表上共享锁S,当扫描到被上了排它锁的行时,就只能等待解锁。

假如1,更新操作是在一个事务里面,由于程序原因,这个事务没有提交,则排他锁永远不回释放,统计SQL则被阻塞。

假如2,此时类似的更新SQL和统计SQL有很多,操作很频繁,则网元信息表处于频繁的加锁、阻塞、解锁中,加大数据库压力,可能引起大面积阻塞。

解决办法:
读写分离
统计SQL显式声明不上锁,select…with(nolock)

8、SQL Server的事务机制

出于性能上的考虑,SQL Server将用户的改动存入缓存中,这些改变会立即写入事务日志,但不会立即写入数据文件。
begin transaction --写日志
update… --写日志,更新缓存
insert… --写日志,更新缓存

commit transaction --写日志,将缓存数据写到磁盘


Sybase、Oracle是否也一样?

9、数据库的死锁


死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用不会释放的资源而处于的一种永久等待状态


[img]http://dl.iteye.com/upload/attachment/0076/2018/fcc45976-1c3a-3a4d-a709-6dda63a75287.jpg[/img]


其满足上面死锁的四个必要条件:
[list]
[*](1).互斥:资源R1和R2不能被共享,同一时间只能由一个任务使用;
[*](2).请求与保持条件:T1持有R1的同时,请求R2;T2持有R2的同时请求R1;
[*](3).非剥夺条件:T1无法从T2上剥夺R2,T2也无法从T1上剥夺R1;
[*](4).循环等待条件:上图中的箭头构成环路,存在循环等待。
[/list]

10、数据库的死锁-程序

程序1:
begin transaction
update table1 … where id=100
select … from table2 where id=1000
commit transaction

程序2:
begin transaction
update table2 … where id=1000
select … from table1 where id=100
commit transaction

11、死锁的后果

SQL Server内部有一个锁监视器线程执行死锁检查,锁监视器对特定线程启动死锁搜索时,会标识线程正在等待的资源;然后查找特定资源的所有者,并递归地继续执行对那些线程的死锁搜索,直到找到一个构成死锁条件的循环。
检测到死锁后,数据库引擎选择运行回滚开销最小的事务的会话作为死锁牺牲品,返回1205 错误,回滚死锁牺牲品的事务并释放该事务持有的所有锁,使其他线程的事务可以请求资源并继续运行。

Oracle、Sybase也具有同样的功能。

死锁对应用程序的影响:不能按照正常的逻辑运行、可能丢数据

办法:try…catch,重新执行该事务

12、Hibernate本身并不具备事务管理能力

Hibernate 是JDBC 的轻量级封装,本身并不具备事务管理能力。在事务管理层,Hibernate将其委托给底层的JDBC或者JTA,以实现事务管理和调度功能。 Hibernate的默认事务处理机制基于JDBC Transaction。我们也可以通过配置文件设定采用JTA作为事务管理实现。

[img]http://dl.iteye.com/upload/attachment/0076/2027/c638e1c3-4e5b-32d9-b7a9-7dca38025697.png[/img]

13、Hibernate的事务使用


[img]http://dl.iteye.com/upload/attachment/0076/2029/80bcf135-ef07-3091-9f0d-5c791b4068f9.jpg[/img]

14、getCurrentSession和openSession的区别


[img]http://dl.iteye.com/upload/attachment/0076/2035/66f419f1-c3e7-36b3-a02a-0cb90cab6367.jpg[/img]

15、使用事务存在的问题一


[img]http://dl.iteye.com/upload/attachment/0076/2037/6a9b9f2a-ed9d-35f3-88da-56ffdb3c28fd.jpg[/img]

16、自动提交事务


[img]http://dl.iteye.com/upload/attachment/0076/2041/53ef3e1c-ff61-3b16-94fc-8a9d51c867b1.jpg[/img]

17、加入Spring的事务管理

[img]http://dl.iteye.com/upload/attachment/0076/2043/a97e1e69-5823-3911-af6d-7854affa6f72.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值