锁(locking)3

问题描述

一个典型的倚赖数据库的悲观锁调用:select*fromaccountwherename=”Erica”forupdate这条sql语句锁定了account表中所有符合检索条件(name=”Erica”)的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。Hibernate的悲观锁,也是基于数据库的锁机制实现。下面的代码实现了对查询记录的加锁:StringhqlStr="fromTUserasuserwhereuser.name='Erica'";Queryquery=session.createQuery(hqlStr);query.setLockMode("user",LockMode.UPGRADE);//加锁ListuserList=query.list();//执行查询,获取数据query.setLockMode对查询语句中,特定别名所对应的记录进行加锁(我们为TUser类指定了一个别名“user”),这里也就是对返回的所有user记录进行加锁。观察运行期Hibernate生成的SQL语句:selecttuser0_.idasid,tuser0_.nameasname,tuser0_.group_idasgroup_id,tuser0_.user_typeasuser_type,tuser0_.sexassexfromt_usertuser0_where(tuser0_.name='Erica')forupdate这里Hibernate通过使用数据库的forupdate子句实现了悲观锁机制。Hibernate的加锁模式有:ØLockMode.NONE:无锁机制。ØLockMode.WRITE:Hibernate在Insert和Update记录的时候会自动获取。ØLockMode.READ:Hibernate在读取记录的时候会自动获取。以上这三种锁机制一般由Hibernate内部使用,如Hibernate为了保证Update过程中对象不会被外界修改,会在save方法实现中自动为目标对象加上WRITE锁。ØLockMode.UPGRADE:利用数据库的forupdate子句加锁。ØLockMode.UPGRADE_NOWAIT:Oracle的特定实现,利用Oracle的forupdatenowait子句实现加锁。上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:Criteria.setLockModeQuery.setLockModeSession.lock注意,只有在查询开始之前(也就是Hiberate生成SQL之前)设定加锁,才会真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含forupdate子句的SelectSQL加载进来,所谓数据库加锁也就无从谈起。

时间: 2024-11-18 18:44:55

锁(locking)3的相关文章

mysql数据据存储引擎InnoDB和MyISAM的优势及区别

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键.如果事物回滚将造成不完全回滚,不具有原子性.如果执行大量的SELECT,MyISAM是更好的选择. InnoDB:这种类型是事务安全的.它与BDB类

InnoDB 中文参考手册 --- InnoDB Tables 概述

参考|参考手册|中文 InnoDB 中文参考手册 --- 犬犬(心帆)翻译 1 InnoDB Tables 概述 InnoDB 给 MySQL 提供了具有事务(commit).回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表.InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking re

MYSQL使用心得(五) InnoDB与MyISAM

本文主要整理了Mysql 两大常用的存储引擎MyISAM,InnoDB的六大常见区别: 构成上的区别 MyISAM 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文 件类型. .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名是.MYI (MYIndex). InnoDB 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件. .user.frm存储表结构. user.ibd存储数 据文件. 事务处理上方面 MyIS

Mysql存储引擎InnoDB和Myisam的六大区别

 这篇文章主要介绍了Mysql存储引擎InnoDB和Myisam的六大区别,本文从构成上.事务处理.SQL操作.自动ID.表行数等方面讲解了它的区别,需要的朋友可以参考下       MyISAM InnoDB 构成上的区别:     每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型.   .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名是.MYI (MYIndex).   基于磁盘的资源是InnoDB表空间数据

大数据量下MySQL插入方法的性能比较

文章讲的是大数据量下MySQL插入方法的性能比较,不管是日常业务数据处理中,还是数据库的导入导出,都可能遇到需要处理大量数据的插入.插入的方式和数据库引擎都会对插入速度造成影响,本文旨在从理论和实践上对各种方法进行分析和比较,方便以后应用中插入方法的选择. 插入分析 MySQL中插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: ·连接:(3) ·发送查询给服务器:(2) ·分析查询:(2) ·插入记录:(1x记录大小) ·插入索引:(1x索引) ·关闭:(1) 如果我们每插入一条都

mysql更改表引擎INNODB为MyISAM的方法总结

常见的mysql表引擎有INNODB和MyISAM,主要的区别是INNODB适合频繁写数据库操作,MyISAM适合读取数据库的情况多一点,如何把表引擎INNODB更改为MyISAM呢? 使用以下mysql sql语句,可以给表设定数据库引擎: ALTER TABLE `wp_posts` ENGINE = MyISAM; 在需要使用mysql的全文索引(FULLTEXT index)的时候,这张表的数据库引擎必须是MyISAM类型.关于INNODB为MyISAM数据库引擎有什么具体区别 例子 修

Mysql存储引擎InnoDB和Myisam的六大区别_Mysql

  MyISAM InnoDB   构成上的区别:     每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型.   .frm文件存储表定义.   数据文件的扩展名为.MYD (MYData).   索引文件的扩展名是.MYI (MYIndex).     基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB     事务处理上方面:     MyISAM类型的表强调的是性能,其执行数度

Mysql 的存储引擎,myisam和innodb的区别_Mysql

简单的表达.  MyISAM 是非事务的存储引擎.  innodb是支持事务的存储引擎.    innodb的引擎比较适合于插入和更新操作比较多的应用  而MyISAM 则适合用于频繁查询的应用    MyISAM --表锁.  innodb--设计合理的话是行锁.  MyISAM 不会出现死锁.    最大的区别就是MYISAM适合小数据,小并发:INNODB 适合大数据,大并发.最大的区别就是在锁的级别上.    MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持. MyISA

总结mysql数据库中InnoDB与Myisam表类型的的六大区别

一.构成上的区别: MyISAM 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名是.MYI (MYIndex). InnoDB 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB 二.事务处理上方面: MyISAM MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不

mysql中导入数据load data在myisam与innodb区别

innodb数据表结构如下:  代码如下 复制代码 Create Table: CREATE TABLE `tinnodb` ( `id` int(11) DEFAULT NULL, `content` mediumtext ) ENGINE=InnoDB DEFAULT CHARSET=utf8 表中的数据为4194304行,通过select into outfile导出  代码如下 复制代码 root@localhost:tiger>select * from tinnodb into ou