`
seaoop
  • 浏览: 15463 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hibernate3学习笔记(2)

 
阅读更多

1)NativeSQL->HQL->EJB QL(JP QL)->QBC(query by Criteria)->QBE(query by Example)。

 

2)一级缓存是Session级的缓存。二级缓存是SessionFactory级别的缓存,可以跨越Session存在,二级缓存依赖第三方缓存框架管理。查询缓存主要是相同的查询语句才可以使用,它又依赖于二级缓存。

 

3)缓存算法,LRU、LFU、FIFO。

 

4)事务特性:ACID(原子性、一致性、独立性、持久性)。

 

5)事务概念

事务并发时可能出现的问题

通常为了获得更好的运行性能,各种数据库都允许多个事务同时运行,这就是事务并发。当并发的事务访问或修改数据库中相同的数据时,通常需要采取必要的隔离机制,反之会出现各种并发问题。这些并发问题可归纳为以下三种

a.脏读:即一个事务读取到另一事务未提交的更新数据。

b.不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。也就是说,后续读取可以读取到另一事务已提交的更新数据

c.虚读:一个事务读取到另一事务已提交的insert数据。

 

事务隔离

解决并发问题的途径是什么?答案是:采取有效的隔离机制。怎样实现事务的隔离呢?隔离机制的实现必须使用锁,下面是锁的基本原理:

 

a.当一个事务访问某个数据库资源时,如果执行的是select语句,必须为资源加上共享锁,如果执行的是insert,update,delete语句,必须为资源加上排他锁,这些锁锁定正在被操作的资源。

b.当第二个事务也要反问相同的资源时,如果执行的select语句,那么也必须为资源加上共享锁;如果执行的是insert,update,或delete语句,也必须为资源加上排他锁。但此时第二个事务并非就立即能为资源加上锁,当第一个事务为资源加的是共享锁时,第二个事务能够为资源加上共享锁,但当第一个事务为资源加的是排他锁时,第二个事务必须等待第一个事务结束,才能为资源加上排他锁。

 

上面已经引出了,共享锁,排他锁。下面来阐述一下锁的种类及概念。

 

1.共享锁

共享锁用于读取数据操作,它允许其他事务同时读取锁定的资源,但不允许其他事务更新它。

2.排他锁

排他锁用于修改数据的场合,他锁定的资源,其他事务部能读取也不能修改。

3.更新锁

更新锁在更新操作初始化截断用来锁定可能要被修改的资源,从而避免使用共享锁造成的死锁现象。

 

锁机制能有效地解决并发事务时的各种问题,但是也会影响到并发的性能。数据库系统提供了4种可选的事务隔离级别,它们是

a.Read Uncommited:读未提交的数据

b.Read commited:读已提交的数据

c.Repeateble Read:可重复读

d.Serialable:串行化

 

Read Uncommited: 该隔离级别读取数据时不使用任何锁。可能会出现脏读,不可重复读,和虚读的问题。

 

Read commited:返回的是读取时间点之前已提交的数据,因此可以避免脏读。但重复读数据时,返回的数据和读取时间点有关,因此会重现不可重复读,另外还会出现虚读现象。

 

Repeatable Read:该隔离级别能够保证重复读,可以避免脏读和不可重复读问题。

 

Serializable:该隔离级别能够避免脏读,不可重复读和虚读现象,是最严格的隔离级别。

 

上面四种隔离级别,从a-d隔离级别越来越严格,数据安全和真实性越来越高,但并发性能越来越低。所以选择什么样的隔离级别应根据应用的具体要求而定。

 

6)设定hibernate的事务隔离级别:综合考虑建议使用Read commited级别。通过hibernate的悲观锁机制和乐观锁机制来解决不可重复读及虚读现象。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics