标签:一个数据库 内容 持久化对象 结果 影响 应用程序 包括 .net ati
Session 接口是 Hibernate 向应用程序提供的操纵数据库的最基本的接口, 它提供了基本的保存, 更新, 删除和载入 Java 对象的方法.
Session 具有一个缓存, 位于缓存中的对象称为持久化对象, 它和数据库中的相关记录相应. Session 可以在某些时间点, 依照缓存中对象的变化来运行相关的 SQL 语句, 来同步更新数据库, 这一过程被称为刷新缓存(flush)
站在持久化的角度, Hibernate 把对象分为 4 种状态: 持久化状态, 暂时状态, 游离状态, 删除状态. Session 的特定方法能使对象从一个状态转换到还有一个状态.
在 Session 接口的实现中包括一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存. 仅仅要 Session 实例没有结束生命周期, 且没有清理缓存。则存放在它缓存中的对象也不会结束生命周期
Session 缓存可降低 Hibernate 应用程序訪问数据库的频率。
flush:使数据库表中的记录和session缓存中的对象的状态保持一致。为了保持一致。则可能会发送相应的sql语句。
显式调用 Session 的 flush() 方法,可能会发送sql语句(为什么使用可能,由于查询得到数据库中的状态与当前对象状态一致则不会发送sql更新),但不会提交事务(发送了sql语句。必须提交事务才会更新数据库)
当应用程序调用 Transaction 的 commit()方法的时, 该方法先 flush(更新) ,然后在向数据库提交事务
当应用程序运行一些查询(HQL, Criteria)操作时,假设缓存中持久化对象的属性已经发生了变化。会先 flush 缓存。以保证查询结果可以反映持久化对象的最新状态(当然这样的情况也仅仅是在事务范围内更新了,还未同步到数据库。仅仅有提交事务才会更新到数据库)
若希望改变 flush 的默认时间点, 能够通过 Session 的 setFlushMode() 方法显式设定 flush 的时间点
会强制发送select语句,以使session缓存中对象的状态和数据库表中的相应的记录保持一致。受数据库隔离级别控制。
(必须了解数据库隔离级别,例如以下所看到的)
对于同一时候执行的多个事务, 当这些事务訪问数据库中同样的数据时, 假设没有採取必要的隔离机制, 就会导致各种并发问题:
脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是暂时且无效的.
不可反复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 假设 T1 再次读取同一个表, 就会多出几行.
数据库事务的隔离性: 数据库系统必须具有隔离并发执行各个事务的能力, 使它们不会相互影响, 避免各种并发问题.
Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED
标签:一个数据库 内容 持久化对象 结果 影响 应用程序 包括 .net ati
原文地址:http://www.cnblogs.com/yfceshi/p/6851800.html