日期:2014-05-17  浏览次数:20382 次

关于一个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 + "

就是以上问题
sql

------解决方案--------------------
默认隔离级别就够了,但是你那update语句貌似比较低效哦,容易造成性能问题
------解决方案--------------------
查询的时候自动用上共享锁,更新时一般用上独占锁或排它锁。
象你这种语句可以简化,没必要用循环去每次查询或更新一次,应该可以一次性完成。
------解决方案--------------------
默认情况下,读数据就会加共享锁,改数据就会加排它锁,不用你加,除非你很熟悉,不然不建议更改这些操作
------解决方案--------------------
引用:
我简单说一下我程序是上怎么写的吧。

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 + "

就是以上问题


获取到同样的数据,那只不代表有错误,因为为了防止读取到不一致的数据,select查询语句在执行时,也会对需要读取的数据加上共享锁S锁,

而下面的update语句,每次在执行时,都会对需要修改的数据加上独占锁X锁。

所以是不需要你手动上锁的哈。
------解决方案--------------------
建议应加事务处理,取表B数据和更新表A数据,回写表B数据..
这一系列操作,要么全部完成,要么全不做.