取出的值设为A 当INSERT或UPDATE的时候,做INSERT(UPDATE)…… WHERE EXISTS (SELECT * FROM tablename WHERE 值='A')这样应该就可以了!
在SQL 查询器中试过了, 用WITH ROWLOCK无法锁定, select a,b,c,d,e from tableA With (ROWLOCK) ,, 在另一个查义器中 update tableA set a="1" 一样可以成功!!!
提供PB的实现原理给你,其实也很简单, 也就是产生UPDATE时的WHERE子句, WHERE CLASS KEY AND UPDATE COLUMN 要使你这种方法以实现,就是产生WHERE +UPDATE_COL=原值 and KEYID=?,, 这样做, 当都查询出来后, A先修改了,B再修改时提交就会不能更新了!因为可更新列的原值被改变了, 产生的WHERE子句就不能成功更新原数据了!
xjbs(大鱼) :不是这样试法的,要用事务处理,单独一句SELECT,早执行完了,有锁也早就释放了。等你去UPDATE时早就没有锁定了。 你用: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE GO begin tran select * from tablea with (rowlock) ....... ...... commit tran 在未提交事务前,肯定用update tableA set a="1"是不会成功的。你再试。
SELECT au_lname FROM authors WITH (ROWLOCK)
那么数据库中的这条记录的字段的最终值应当是最后提交的用户所修
改的值. 而这样,可能会产 生错误! 对银行这样的系统,问题可就大了.SQL Server难道对这种常见的问题没有提供解决方案吗?
SELECT * FROM TABLENAME WITH (ROWLOCK)
但还是不能限制两个用户读同一条记录.也就是说,无法避免在两个用户的界面上
显示同一条记录! 其中一个用户修改这条记录,而另一个用户无法知道其它人也在修改数据.当第一个用户提交后,另一个用户的界面上仍然是原来数据,他也可能修改,并提交,所以悲观锁也无法避免这种问题啊!
这个解决方案还是挺好的啊,谢谢!
当INSERT或UPDATE的时候,做INSERT(UPDATE)…… WHERE EXISTS (SELECT * FROM tablename WHERE 值='A')这样应该就可以了!
用WITH ROWLOCK无法锁定,
select a,b,c,d,e from tableA With (ROWLOCK)
,,
在另一个查义器中
update tableA set a="1"
一样可以成功!!!
也就是产生UPDATE时的WHERE子句,
WHERE CLASS
KEY AND UPDATE COLUMN
要使你这种方法以实现,就是产生WHERE +UPDATE_COL=原值
and KEYID=?,,
这样做,
当都查询出来后,
A先修改了,B再修改时提交就会不能更新了!因为可更新列的原值被改变了,
产生的WHERE子句就不能成功更新原数据了!
你用:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
begin tran
select * from tablea with (rowlock)
.......
......
commit tran
在未提交事务前,肯定用update tableA set a="1"是不会成功的。你再试。