hibernate当中的事务操作
(1)事务当中的概念
(2)事务的特点(ACID)
(3)事务的并发问题
脏读:一个事务读取到另一个事务为提交的数据
不可重复读:一个事务读取到另一个事务已经提交的update的数据,导致在一个事务中的多次查询的结果不一致
虚读|幻读:一个事务读到了另一个事务已经提交的insert的数据,导致在一个事务中的多次查询结果不一致。
(4)由此提出事务的隔离级别,分为4个,分别为:读未提交,读已提交,可重复读,串行。
(5)如何在hibernate当中设置隔离级别
从project->etc->hibernate.properties找到isolation level,在hibernate.cfg.xml当中修改。
其中有4个级别 1、2、4、8,即为0001、0010、0100、1000,期分别为读未提交,读已提交,重复读,串行化
(6)在项目中如何管理事务?
即在业务开始之前打开事务,在业务执行之后提交事务,执行过程当中出现异常,回滚事务
在dao层操作数据库需要到session对象,在service层控制事务也是用到sesson对象完成,我们要确保dao层和service层使用的应该为同一个session对象。
解决方案:将session绑定到当前的线程上。hibernate框架已经进行了相关操作,我们开发人员只需要调用sessionFactory。getCurrentSession方法即可获得与当前线程绑定的session对象。
注意1.1调用getCurrentSession 时,需要在配置文件当中自己写入,(properties文件当中找不到,需要手写)
<property name="hibernate.current_session_context_class">thread</property>
1.2通过getCurrentSession 方法获得session对象,当事务提交时,session会自动关闭,不要手调用close,否则会抛出异常