Hibernate中事务的管理
1、什么是事务?
事务:transaction,指的是业务逻辑的最小单元,由一组DML语句操作,执行要么全部成功,要么全部失败。
2、事务的四大特性
原子性:事务是业务逻辑的最小单元,不可分割。
一致性:事务由一组DML语句操作组成,要么全部执行成功,要么全部失败。
隔离性:事务A的执行与事务B隔离,不受其他事务的影响。
持久性:事务执行的结果,必须持久化保存到硬盘上的数据库中。
3、如果不考虑隔离性,引发的安全问题
读的问题:
脏读:一个事务读到另一个事务还未提交的数据。
不可重复读:一个事务读到另一个事务已经提交的update数据,造成多次查询结果不一致。
幻读:一个事务读到另一个事务已经提交的insert数据,造成多次查询结果不一致。
写的问题(了解):
丢失更新。也就是更新覆盖。
4、事务的隔离级别
读未提交:Read uncommitted,最低级别,以上问题都会发生。
读已提交:Read committed,解决了脏读,但是不可重复读和幻读有可能发生。
可重复读:Repeated read,解决了脏读、不可重复读,但是幻读可能发生。
可串行化:Serializable,事务同步执行,解决了所有的问题,但是效率就变低了。
Oracle默认使用第二种:读已提交。
MySQL默认使用第三种:可重复读。
5、Hibernate中设置事务的隔离级别
在核心配置文件hibernate.cfg.xml的<session-factory>标签中配置:
<!-- 设置事务的隔离级别,MySQL默认是4,即可重复读 -->
<property name=”hibernate.connection.isolation”>4</property>
可选值有:
读未提交:1
读已提交:2
可重复读:4
可串行化:8
6、Hibernate中的事务管理
Hibernate内部已经把这个事情做了,只需要我们完成一段配置信息即可。
Hibernate5提供了三种管理Session对象的方法:
Session对象的生命周期与本地线程绑定。
Session对象的生命周期与JTA事务绑定。
Hibernate委托程序管理Session对象的生命周期。
在Hibernate核心文件hibernate.cfg.xml的<session-factory>标签中配置:
<!-- 配置当前线程绑定的事务 -->
<property name=”hibernate.current_session_context_class”>thread</property>
可选值有:
thread:Session对象的生命周期与本地线程绑定。
jta:Session对象的生命周期与JTA事务绑定。
managed:Hibernate委托程序管理Session对象的生命周期。