日期:2014-05-18  浏览次数:20438 次

请问有关update锁定的问题
我有一个页面的要提交update(多用户的)
我想问一下
带where的update在SQLSERVER里执行的时候是不是会分解成select,delete和insert,
它是一个原子操作吗?或者说:
update的排它锁是在select开始时就启用的吗?

比如多用户时,update   tbl   set   f1   =   f1   -1   where   f1   >   0   会不会导致问题.
或者update   tbl   set   f1   =   f1   -1   where   id   in   (select...)这样又会不会有问题.

还有就是,建立在update某表之上的对其他表进行更新的触发器能够保证在其他用户的update提交之前被执行吗?   多谢!

------解决方案--------------------
1、原子操作

2、不会有问题

3、能够保证
------解决方案--------------------
更新时是排它锁,更新一行后,如果事务未提交,其它连接再不能查询到此行。

采用什么锁主要看事务的关连性。
如果A 事务对表更新后,还要统计表的数据,用行锁肯定不行。必须用表锁。
否则 如果用行锁,事务B 更新后会影响后续的统计数据。

试了一下,感觉是这样,对锁定,
A的 update的事务提交前会对锁定的记录临时保存未update与update完的数据记录
这时如果有其它连接的B -update,update的where除检索未锁定的记录外,还会检索临时保存的记录,如临时保存的记录在where的检索条件之内,则会等A 事务提交后再接着执行,如临时保存的记录未在where的检索条件之内,则会直接update未被锁定的记录数据。