在事务中的mysql select语句锁表会加锁吗

2013年6月 MS-SQL Server大版内专家分月排行榜第一
2013年7月 MS-SQL Server大版内专家分月排行榜第三
2010年7月 荣获微软MVP称号
2008年11月 MS-SQL Server大版内专家分月排行榜第一2008年10月 MS-SQL Server大版内专家分月排行榜第一
2013年 总版技术专家分年内排行榜第二
2014年8月 总版技术专家分月排行榜第一2014年7月 总版技术专家分月排行榜第一2014年6月 总版技术专家分月排行榜第一2014年5月 总版技术专家分月排行榜第一2014年4月 总版技术专家分月排行榜第一2014年3月 总版技术专家分月排行榜第一2014年1月 总版技术专家分月排行榜第一2013年12月 总版技术专家分月排行榜第一
2013年 总版技术专家分年内排行榜第二
2014年8月 总版技术专家分月排行榜第一2014年7月 总版技术专家分月排行榜第一2014年6月 总版技术专家分月排行榜第一2014年5月 总版技术专家分月排行榜第一2014年4月 总版技术专家分月排行榜第一2014年3月 总版技术专家分月排行榜第一2014年1月 总版技术专家分月排行榜第一2013年12月 总版技术专家分月排行榜第一
2016年12月 总版技术专家分月排行榜第三
2016年12月 Oracle大版内专家分月排行榜第一2016年11月 Oracle大版内专家分月排行榜第一2016年10月 Oracle大版内专家分月排行榜第一2016年7月 Oracle大版内专家分月排行榜第一2016年6月 Oracle大版内专家分月排行榜第一2016年5月 Oracle大版内专家分月排行榜第一2016年4月 Oracle大版内专家分月排行榜第一2016年3月 Oracle大版内专家分月排行榜第一2016年2月 Oracle大版内专家分月排行榜第一2015年12月 Oracle大版内专家分月排行榜第一2015年11月 Oracle大版内专家分月排行榜第一2015年10月 Oracle大版内专家分月排行榜第一2015年9月 Oracle大版内专家分月排行榜第一2015年8月 Oracle大版内专家分月排行榜第一2015年7月 Oracle大版内专家分月排行榜第一2015年5月 Oracle大版内专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。SELECT 语句中“加锁选项”的功能说明
  SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能。用户既能使用SQL Server的缺省设置也可以在select 语句中使用“加锁选项”来实现预期的效果。 本文介绍了SELECT语句中的各项“加锁选项”以及相应的功能说明。   
功能说明:    
NOLOCK(不加锁)   
此选项被选中时,SQL Server 在读取或修改数据时不加任何锁。 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回滚(Roll Back)中的数据, 即所谓的“脏数据”。   
HOLDLOCK(保持锁)   
此选项被选中时,SQL Server 会将此共享锁保持至整个事务结束,而不会在途中释放。      
UPDLOCK(修改锁)   此选项被选中时,SQL Server 在读取数据时使用修改锁来代替共享锁,并将此锁保持至整个事务或命令结束。使用此选项能够保证多个进程能同时读取数据但只有该进程能修改数据。   
TABLOCK(表锁)   此选项被选中时,SQL Server 将在整个表上置共享锁直至该命令结束。 这个选项保证其他进程只能读取而不能修改数据。      
PAGLOCK(页锁)   此选项为默认选项, 当被选中时,SQL Server 使用共享页锁。      
  TABLOCKX(排它表锁)   此选项被选中时,SQL Server 将在整个表上置排它锁直至该命令或事务结束。这将防止其他进程读取或修改表中的数据。     
  使用这些选项将使系统忽略原先在SET语句设定的事务隔离级别(Transaction Isolation Level)。 请查阅SQL Server 联机手册获取更多信息。
select * from tablename where ... with(nolock)
select * from tablename where ... with(holdlock)
select * from tablename with (rowlock) where id=3 注意: 锁定数据库的一个表的区别
SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除
SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除
相关报道:
新闻热线:010-
责任编辑:
名企动态: |
标志着Windows迈出个性化计算的第一步……
本站特聘法律顾问:于国富律师
Copyright (C) 1997-【图文】第十章 事务与锁_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第十章 事务与锁
上传于||暂无简介
大小:901.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢在事务中的select语句会加锁吗?解决方案 - Oracle开发当前位置:& &&&在事务中的select语句会加锁吗?解决方案在事务中的select语句会加锁吗?解决方案&&网友分享于:&&浏览:109次在事务中的select语句会加锁吗?各位大大求教~
在一个事务中有select&from&xx&where&xx&查询到一条记录,这条记录会加锁吗?
在这个事务提交之前,别的事务能update这条记录吗?
谢谢~~------解决方案--------------------只有在进行insert、delete和update这些需要commint操作的时候,才会进行加锁。
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有hibernate(16)
数据库(5)
最近在复习hibernate以及数据库事务和隔离级别的相关知识,有了一点新的理解。mysql可以通过下面的命令:查询和修改当前客户端连接的autocommit。0代表不自动提交,1代表自动提交。
什么是自动提交呢?对于insert、update、delete这些DML语句来说,如果没有提交,被修改的记录处于uncommited状态的;如果提交了,那么处于commited状态的。下面的客户端1和2设置的事务隔离级别都是repeatable read,所以客户端2看不到客户端1的修改。如果客户端1打开了autocommit,那么客户端2就可以查看到客户端1修改后的结果。
mysql如果我们想开启一个事务,可以通过start &transaction;如果提交这个事务用commit;如果需要放弃回滚,那么可以使用rollback。
#提交一个事务
#some sql statements
#some sql statements
可以看到autocommit和事务很像,我自己认为:执行第一条SQL语句的时候,如果我们没有显示地开启事务,那么数据库服务器会自动帮我们开启一个事务;如果打开了autocommit,每一条sql执行结束的时候,数据库服务器会自动关闭事务。如果关闭了autocommit,那么数据库就不会自动帮我们提交事务。
也就是说:如果开启了autocommit,数据库服务器自动开启事务(每一条sql语句开始执行的时候),自动提交事务(sql语句执行成功),自动回滚事务(sql语句执行失败)。很显然:autocommit没有什么实际意义,如果要使用事务,就必需关闭autocommit,不然每一条sql都是一个独立的事务,而实际上事务包含了一组sql语句。最佳实践:对于DML操作,我们需要显示开始、显示提交或者回滚事务,哪儿怕事务里面只有一条sql语句。
public void testHibernateSave() {
Student student = new Student();
student.setName(&saveWithHibernate&);
student.setAge(3);
Session session = sessionFactory.openSession();
session.beginTransaction();//开启事务
session.save(student);
session.save(student);
session.getTransaction().commit();//提交事务
session.close();
现在我们理解autocommit和事务了,那我们再看一下select语句,select语句需要加事务吗?public void testSelect() {
Session session = sessionFactory.openSession();
Student student = (Student) session.get(Student.class, 100);
System.out.println(student);
session.close();
public void testSelectWithTransaction() {
Session session = sessionFactory.openSession();
session.beginTransaction();//开启事务
Student student = (Student) session.load(Student.class, 100);
System.out.println(student);
session.getTransaction().commit();//提交事务
session.close();
}上面的2种查询方式,都能从数据库查出我们需要的结果。那到底select的时候需不要加事务呢?这个问题,网上有很多争论,有人说需要加,有人说不需要,比如iteye上的。我来谈下自己的看法,不一定对,有错误的话欢迎指正。
读操作最重要的是什么呢?一致性。写操作最重要的是什么吗呢?原子性。如果一个客户端(占用一个数据库连接),只需执行要一条select,那么显然加不加事务没有任何影响。如果一个客户端,需要执行多条select,对于这个客户端来说,最重要的就是读的一致性了。比如我第一次读取这条记录,第二次再次读取这条记录,客户端肯定希望这2次的读取结果是一模一样的。
客户端1的事务隔离级别是:REPEATABLE-READ,关闭了autocommit,如果客户端1没有显示地commit,那么永远也看不见客户端2修改后的数据。如果客户端1显示提commit之后,再次查询,就能够读取到客户端2修改后的结果了。我们知道:一个数据库连接可以开启多个数据库事务。至于一个数据库事务里面多次查询结果是否一致,是取决于事务隔离级别的。不同的隔离级别能够解决不同的数据库并发问题:
所以我认为:如果我们没有显示地开启事务,那么当执行第一条sql语句(不管是select,还是DML)都会开启一个事务。如果打开了autocommit,那么sql执行成功后会自动提交;如果关闭了autocommit,那么我们必须要显示地commit或者rollback。
public void testSelect() {
Session session = sessionFactory.openSession();
Student student = (Student) session.get(Student.class, 100);
System.out.println(student);
session.close();
hibernate默认会关闭autocommit,上面的代码没有显示开启和提交事务。当执行select的时候,底层的数据库连接会自动开启事务,我们没有显示地提交事务,这是因为session.close会释放底层的数据库连接,数据库连接被释放,没有提交的事务会被自动回滚。所以使用hibernate的时候,DML操作我们需要显示地开启事务和提交事务,如果是查询操作不需要显示地开启和提交事务。
写到这里,有一个地方是存在争议的:如果没有显示地开启事务,mysql数据库到底会不会在执行第一条SQL的时候自动开始事务。从上面的测试结果来看,应该是会的,或者说至少也会开启一个类似事务的东东(出于性能的考虑)。因为我们没有显示地开启事务,执行DML语句后commit,这些修改确实被永久保存到了数据库。而且执行select后,如果不commit,那么后续的select永远也看不到另一个客户端的修改结果。从表现上来看,这跟事务没有什么两样。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:404778次
积分:7181
积分:7181
排名:第2397名
原创:316篇
评论:146条
(15)(8)(2)(2)(1)(9)(7)(1)(7)(5)(22)(17)(14)(16)(2)(3)(9)(10)(6)(13)(9)(16)(3)(16)(17)(29)(9)(10)(3)(7)(19)(9)(1)(3)(1)(2)

我要回帖

更多关于 select语句 的文章

 

随机推荐