MS-SQLServer ,如何锁定一行记录,使其它事务可读不可修改?
我用了TABLOCKX ,其它事务整个表都不能读了。
用ROWLOCK,其它事务还可以修改。
问题点数:100、回复次数:7Top
1 楼tj_dns(愉快的登山者)回复于 2003-04-02 18:11:47 得分 15
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
select * from table rowlock where id = ..Top
2 楼caiyunxia(夏才云)回复于 2003-04-02 20:07:27 得分 15
用上述方法,当同时操作时,会提示错误Top
3 楼CDINnet(CDIN.Net)回复于 2003-04-03 09:50:06 得分 10
也可以在记录后加个操作标记:如字段Locked,Bit类型
修改记录时将需要锁定的记录的Locked置为1,
释放时,再置回0,也很方便Top
4 楼caiyunxia(夏才云)回复于 2003-04-03 09:53:08 得分 20
SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
参数
READ COMMITTED
指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是 SQL Server 的默认值。
READ UNCOMMITTED
执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。
REPEATABLE READ
锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
SERIALIZABLE
在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。
Top
5 楼Ibangbang(梆梆)回复于 2003-04-03 09:59:08 得分 20
楼上正解,提高事务的隔离级别,不过在性能有损失Top
6 楼gpg(snake)回复于 2003-04-03 10:53:06 得分 0
加个操作标记:如字段Locked,Bit类型
修改记录时将需要锁定的记录的Locked置为1,
是不行的,
在不可预知的情况下没释放掉怎么办.Top
7 楼yun521(yun521)回复于 2003-04-03 17:17:46 得分 20
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDTop




