我目前的情况是有两个进程会同时读写同一张表,环境是.net 3.5或者4.0 + sql server 08,请问: 1.这样的情况要注意什么问题,需要加锁吗?如何加? 首先同意yupeigu的说法,程序上需要全局变量控制提交给SQL的变量.SQL层面上,如果是数据自动管理的锁,tzleo 回答了你的问题. 如果需要人为干预加锁,那么你可以使用Locking Hint, 请参考: http://technet.microsoft.com/en-us/library/ms172398.aspx 例子: 下面的Locking HINT保证了整个表在被某个transaction获得X锁后,完全被锁住.其它的 transaction不可以可以访问,修改该表. Begin Trans INSERT INTO table WITH ( TABLOCK )...... COMMIT Trans 2.如果我改用线程来做同样的事情,需要注意什么问题,需要加读写锁吗? 没看懂什么意思. 3.如果使用C++的话上述问题答案会不一样吗 程序层面,不懂
[quote=引用 9 楼 tzleo 的回复:] [quote=引用 8 楼 DBA_Huangzj 的回复:] 纯读操作不会有什么影响,不过要看你是不是还有后续操作或者只有2个线程
[quote=引用 8 楼 DBA_Huangzj 的回复:] 纯读操作不会有什么影响,不过要看你是不是还有后续操作或者只有2个线程
纯读操作不会有什么影响,不过要看你是不是还有后续操作或者只有2个线程
对于查询,可以简单地理解为:在查询的数据上加了共享锁(在行级别加共享锁的同时,当然在表级别,也有意向共享锁,防止别人在你查询的时候把表给删除了,同理,在数据库级也有共享锁) 对于update语句,可以简单地理解为sqlserver先做查询,把要修改的记录给找到,然后在这个记录上做修改。 找记录的动作要加S锁,找到要修改的记录后会先加U锁,再将U锁升级成X锁。 至于锁加载那个级别(行锁,页锁,表锁等等),跟具体的表结构和索引类型有关 举个例子,如果按照ID更新,ID列上有索引,当更新执行中时,其他事物无法访问该ID的数据,包括读 如果表上ID上没有任何索引,加锁的就是整个表,导致整个表无法被访问 这些锁都是在事务提交之后释放的,这就要求,sql的执行后越早提交越好, 说白了还是跟sql执行效率和修改数据的量有关 我简单地测试过,用C#,同一张表,往里面写数据,开10个线程,每个线程往表中写1000条数据 这十个线程耗时900毫秒到1100毫秒不等 I3四核的个人电脑,仅做参考
1、sql server会自动加锁,不需要通过程序来加锁的 2、是sql server自动加的读写锁,不需要程序来加锁。 3、c++,也是一样的
22,207
社区成员
121,730
社区内容
加载中
试试用AI创作助手写篇文章吧