蜘蛛侠大:悲观锁

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 13:13:55
 l悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。 l悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 lselect * from account where name=”Erica” for update.这条sql 语句锁定了account 表中所有符合检索条件(name=”Erica”)的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。  String hqlStr = "from TUser as user where user.name='Erica'"; Query query = session.createQuery(hqlStr); query.setLockMode("user",LockMode.UPGRADE); //加锁 List userList = query.list();//执行查询,获取数据  lLockMode.NONE :有缓存用缓存,没缓存则从数据库读 lLockMode.READ :直接从数据库读,不使用缓存数据 lLockMode.WRITE :在insert update数据的时候,HIBERNATE内部使用的。 l以上3种均为HIBERNATE级别的锁,也就是缓存级别的锁。 l下面2种为数据库级别的锁: lLockMode.UPGRADE:相当于SQL语句select for update,被select的数据都被数据库锁住了,不能被其他事务 l修改。 lLockMode. UPGRADE_NOWAIT :是ORACLE数据库特有的select for update nowait  l加锁一般通过以下方法实现
Criteria.setLockMode Query.setLockMode Session.lock l只有在查询开始之前(也就是Hiberate 生成SQL 之前)设定加锁,才会真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含for update子句的Select SQL加载进来,所谓数据库加锁也就无从谈起。