关于一个SQL的问题,是否需要上锁?
我简单说一下我程序是上怎么写的吧。
string ohtml="";
for(int i==0 ;i<5;i++)
{
ohtml+= op(i) + "|";//op函数为获取表A字段zd=0的数据
setopstate(i);//设置表A字段zd=1的数据
}
这里ohtml 会获取的同样的数据,只是偶尔,我不知道怎么回事
op函数里涉及的sql
select * from A where zd=0 and id= " + i + "
setopstate函数里涉及的sql
update A set zd=1 where id=" + i + "
就是以上问题
------解决方案--------------------默认隔离级别就够了,但是你那update语句貌似比较低效哦,容易造成性能问题
------解决方案--------------------查询的时候自动用上共享锁,更新时一般用上独占锁或排它锁。
象你这种语句可以简化,没必要用循环去每次查询或更新一次,应该可以一次性完成。
------解决方案--------------------默认情况下,读数据就会加共享锁,改数据就会加排它锁,不用你加,除非你很熟悉,不然不建议更改这些操作
------解决方案--------------------
获取到同样的数据,那只不代表有错误,因为为了防止读取到不一致的数据,select查询语句在执行时,也会对需要读取的数据加上共享锁S锁,
而下面的update语句,每次在执行时,都会对需要修改的数据加上独占锁X锁。
所以是不需要你手动上锁的哈。
------解决方案--------------------建议应加事务处理,取表B数据和更新表A数据,回写表B数据..
这一系列操作,要么全部完成,要么全不做.