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

请教一个oracle相关的问题
下面是一段更新pg_fs表内分值的语句,曾经找了十几个人同时更新没有问题,当把程序安装到客户的服务器上的时候,找了100人同时更新分数的时候,开始还能更新,但是一会儿之后发现所有人的数据都更新不了了,但是不返回错误值,不知道为什么?谁能帮我看看是怎么回事啊?数据库用的是oracle10g。不同的人是update同一个表中的不同记录。
                  OracleConnection   con=DB.createConnection   ();
con.Open   ();
if(k> 15)
{
k   =   15;
}
string   sql   =   "update   pg_fs   set   yjjy   = ' "   +   yjjy   +   " ',pgrq   =   to_date(substr( ' "   +   DateTime.Now.Date.ToString( "yyyyMMdd   HH:mm:ss ")   +   " ',1,17), 'yyyy-mm-dd   hh24:mi:ss ') ";
for(int   i   =   1;i   <=   k;i++)
{
sql   += ",score "   +   i.ToString()   +   "   =   ' "   +   score[i-1]   +   " ' ";
}
sql   +=   "   where   bpgr   =   ' "   +   bpgr   +   " '   and   pgr   =   ' "   +   pgr   +   " '   and   lx   =   ' "   +   lx   +   " '   and   term   =   ' "   +   term +   " '   and   lesson   =   ' "   +   lesson   +   " ' ";

OracleTransaction   tx;
tx   =   con.BeginTransaction();
OracleCommand   cmd=new   OracleCommand   (sql,con,tx);
try
{
cmd.ExecuteNonQuery   ();
tx.Commit();
}
catch(Exception   err)
{
tx.Rollback();
                                    return   err.Message;
}
finally
{
con.Close();
tx.Dispose();
con.Dispose();
cmd.Dispose();
}
return   "ok ";

------解决方案--------------------
1。
但是不返回错误值,不知道为什么?
=========
死了?
既然选择异常模型,就应该直接 throw 出来

2。
con.Dispose();
cmd.Dispose();
==========
一般情况下,没必要手动 Disponse,这里即不需要。


------解决方案--------------------
1。
打断点,调试跟踪

2。
检查影响值:

int affectedRecords = cmd.ExecuteNonQuery ();
if(affectedRecords <= 0) {
throw new Exception( "没有行受影响。 ");
}
------解决方案--------------------
楼主没有什么开发经验呀:
1:没有防止sql注入
2:不知道你上面这段代码的运行环境是什么样的,是不是多线程运行的,那属性 "K "是在哪儿定义的,不知道会不会造成线程脏读.

我想如果没有报错再加上你说得 "20 ", "100 ",最大的问题可能是线程问题
------解决方案--------------------
我想,首先必须在服务端监控一下SESSIONS,看看是否有什么异常,有的SESSION还会显示相关的的SQL.
如果SESSION没有提示相关被阻塞情况,则可以考虑是否你的程序写的有问题,是否有可能为.NET的原因导致的。
比较妥当的做法就是设置表格或者文件自动记录执行的SQL以及相关信息,从而判断是什么导致的。