怎样锁住一个表不被查询和修改

来源:互联网  责任编辑:小易  时间:2017/5/24 17:47:44
本网有用户碰到这样的问题:怎样锁住一个表不被查询和修改,具体问题如下:

本帖最后由 aierda 于 2017-01-04 19:07:23 编辑

本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:

=================1楼=====================

最好从设计层面 就避开这样的设计,如果某个属性需要实时更新建议进内存(比如内存数据库,就是应对此类问题的)

=================2楼=====================

串行式事务,加排他锁查询。

=================3楼=====================

对此表的访问进行封装,对读写操作增加锁机制。

=================4楼=====================

稍微封装下,加个islocked属性怎样。

=================5楼=====================

引用 2 楼 closurer 的回复:
串行式事务,加排他锁查询。

大哥,有没有具体的例子参考的呢

=================6楼=====================

引用 5 楼 aierda 的回复:
Quote: 引用 2 楼 closurer 的回复:

串行式事务,加排他锁查询。

大哥,有没有具体的例子参考的呢


http://bbs.csdn.net/topics/392073650

我在这里写了一个开头,迟点会写解决方法。

=================7楼=====================

引用 5 楼 aierda 的回复:
Quote: 引用 2 楼 closurer 的回复:

串行式事务,加排他锁查询。

大哥,有没有具体的例子参考的呢


SQL Server 会对你的应用程序的每一个独立的会话的每一条 sql 语句默认产生一个 Transaction。你的程序实际上假设有2条以上的语句,你就需要显示地创建一个 DbTeansaction。

如果没有这个概念,就会出现非常简单的理解错误。例如 #6 楼举得例子中,在 delay 的时候(外层)并没有事务,所以例子是错误的!

=================8楼=====================

你就需要显示地创建一个 DbTeansaction   -->   你就需要显示地创建一个 DbTransaction


你应该先看看如何在应用程序执行多条sql语句的时候,放到一个事务中。

这么简单的事务概念,如果你不知道在多条语句外边有一个事务,还怎么奢谈事务的“锁”呢?

=================9楼=====================

如果一个表是频繁修改的, 即使能做到, 你所谓的实时根本没有任何意义。

你看的那一瞬间, 数据早就变化了。 

但你所谓的锁住, 实际给这个表的修改、查询制造了非常多的堵塞、死锁的机率, 效率下降的不是一点点, 制造的混乱后果也许你都没有办法处理——在生产环境不能停机、重启的情况下。

=================10楼=====================

给连接数据库的用户添加权限呗,限制其只能操作某些表,别说你是程序连接数据库的,程序连接数据库也要制定一个身份把,比如sa

=================11楼=====================

动态变化还直接存数据库?
直接用缓存数据库缓存,定时更新到数据库

=================12楼=====================

我不是很清楚你的应用场景,看你的描述,你好像需要一个很高级别的锁。

表级的锁,最高级别的隔离这样做:

一、串行化事务:


set transaction isolation level serializable


二、对整个表加排它锁

select * from table1 with(tablock, xlock)


这样对性能是有较大的影响的,你要确定在你的例子中是否真的需要这样做。

参考:
http://blog.csdn.net/closurer/article/details/54291241

=================13楼=====================

引用 7 楼 sp1234 的回复:
Quote: 引用 5 楼 aierda 的回复:

Quote: 引用 2 楼 closurer 的回复:

串行式事务,加排他锁查询。

大哥,有没有具体的例子参考的呢


SQL Server 会对你的应用程序的每一个独立的会话的每一条 sql 语句默认产生一个 Transaction。你的程序实际上假设有2条以上的语句,你就需要显示地创建一个 DbTeansaction。

如果没有这个概念,就会出现非常简单的理解错误。例如 #6 楼举得例子中,在 delay 的时候(外层)并没有事务,所以例子是错误的!


是的,事务的开始和提交,是必须要加的。

只是加了事务之后,锁也要加,查询语句默认放置的共享锁,有些情况下是不能满足需求的。

如果您还有更好的解决方法,请在最下面评论中留下您的解决方法


  • 本文相关:
  • 站长必读,如何真正写好一篇原创文章
  • 互联网之路细嗅蔷薇 资深站长分享掘金之道
  • 企业站的站长的工作重心究竟有哪些
  • 浅析:行业门户网站的一些盈利模式
  • 3000IP的企业网站每天订单不到30个的苦恼
  • 网站想内外兼修?先学习提高网站可用性的6大原则
  • 浅谈网页设计中的简约之美
  • 网页改版实战:日本设计师如何彻底优化旅游网站?
  • 网页改版实战!日本设计师如何彻底优化招聘网站?
  • 2015年值得关注的21个网页设计趋势
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2015 www.zgxue.com All Rights Reserved