事务:
事务通俗说就是逻辑上的一组操作,要么全都成功,要么全都失败!!!
事务有四个特性,简称为ACID:
原子性(Atomicity):事务一组操作不可分割.
一致性(Consistency):事务的执行前后,数据完整性要保持一致.
隔离性(Isolation):个事务在执行的过程中不应该受到其他事务的干扰.
持久性(Durability:一旦事务结束,数据就永久保存数据库.
有了四大特性,才能保证事务过程中数据的正确性。
其中事务的隔离性最为重要,如果不考虑事务的隔离性引发一些安全性问题:
5大类问题:3类读问题 2类写问题.
读问题:
* 脏读 :一个事务读到另一个事务未提交数据.
* 不可重复读 :一个事务读到另一个事务已经提交数据(update),导致查询结果不一致.
* 虚读 :一个事务读到另一个事务已经提交的数据(insert),导致查询结果不一致
避免三种读的问题:
* 设置事务的隔离级别:
* 未提交读:以上三种读问题 都有可能发生.
* 已提交读:避免脏读,但是不可重复读和虚读有可能发生.
* 重复读:避免脏读和不可重复读,但是虚读是有可能发生.
* 串行的:可以避免以上三种读问题.
事务隔离级别:
ANSI SQL 标准定义了隔离级别,但并不是SQL数据库独有.JTA也定义了同样的隔离级别.级别越高,成本越高
设置事务隔离级别:
在Hibernate中设置事务的隔离级别:
在核心配置文件中配置:
<property name="hibernate.connection.isolation">4</property>
注意:
*Hibernate不可能改变在受管环境下由应用服务器提供的数据库连接的隔离级别,只能通过改变应用服务器配置的方式来改变
* 设置隔离级别是全局选项,会影响所有的连接和事务.有时需要为某个特定事务指定更多的限制.
* Hibernate依赖于乐观的并发控制,使用版本检查和悲观锁实现附加的锁支持
写问题:丢失更新(详解看之后博客)
* 解决方法;
* 悲观锁:
* // 使用悲观锁(排他锁)
Customer customer = (Customer) session.get(Customer.class, 3, LockMode.UPGRADE);
* 乐观锁;
* hbm.xml配置一个<version>标签
session管理(详解看之后的博客):
线程绑定的session:
* 在核心配置文件中配置一个:
<property name="hibernate.current_session_context_class">thread</property>
* 使用SessionFactory中的getCurrentSession();方法.
注意:当前线程中的session不需要进行关闭,线程结束后自动关闭!!!否则报异常!