现有十条数据,要求一次性插入tbProject表中
其中用到事务,在程序中代码如下
//开始事务
Database db = DatabaseFactory.GetGlobalDatabase();
using(IDbConnection connection = db.GetConnection())
{
connection.Open();
IDbTransaction transaction = connection.BeginTransaction();
        for(int i = 0; i < 10; i ++)
{

/*****以下为数据库参数***/
                问题在这里
//strID为一个传入数据库中的参数
//GetMaxID()函数为获得tbProject中最大的ID然后自动+1
//问题是当i=0的时候执行正常,当i=1的时候调试跟踪发现程序进入GetMaxID()的时候发现数据库表死锁现象,出现超时
//当我没有用到事务的时候,就是更改以下代码为db.ExecuteNonQuery(creditCommandWrapper);程序执行正常
//数据库使用为sql server2000请问有没有好的解决方案
string strID = GetMaxID();
.....
/************************/
try
{
db.ExecuteNonQuery(creditCommandWrapper,transaction);

if(i == 9)
transaction.Commit();
}
catch(Exception en)
{
transaction.Rollback();
connection.Close();
throw en;
}
}
}
注意:数据库不能改动,因为是在一个现有的系统上扩展功能的,所以绝对不能更改数据库表结构

解决方案 »

  1.   

    what is in string strID = GetMaxID();?try to pass transaction instring strID = GetMaxID(connection,transaction);
    ...
    :
    connection.Open();
    IDbTransaction transaction = connection.BeginTransaction();
    try
    {
             for(int i = 0; i < 10; i ++)
    {


    string strID = GetMaxID(connection,transaction );


    db.ExecuteNonQuery(creditCommandWrapper,transaction);




    } transaction.Commit();
    }
    catch(Exception en)
    {
    transaction.Rollback();
    connection.Close();
    throw en;
    }
      

  2.   

    catch(Exception en)
    {
      transaction.Rollback();
      throw en;
    }
    finally
    {
     connection.Close();
    }
      

  3.   

    可以这样解决.
    把当前表的最大id 放在 另一个表里.当用时去哪个表取,并具每次都是更新哪个表.这要在执行当有的语句时就和当前表没有关系了.就不会有死锁的现像,也能保证id 的唯一.以前做项目时经常是这么做的.///*************************///
    这两年来慢慢习惯了光说不练
    ///*************************///
      

  4.   

    GetMaxID();
    这个函数只是对表tbProject进行查询,并不涉及其他操作string strID = GetMaxID(connection,transaction);
    可以试试
      

  5.   

    为什么不直接使用sql server中的事务处理了,节省代码,我一直在这么使用,感觉运行不错
      

  6.   

    用saucer(思归)老大的方法应该OK吧
      

  7.   

    按照上面的方式解决了string strID = GetMaxID(connection,transaction);
    不过有点还不明白GetMaxID()为什么连查询都不行
      

  8.   

    回复人: shoutor(http://www.i2key.com) ( ) 信誉:100  2005-11-23 11:02:00  得分: 0  
     
     
       为什么不直接使用sql server中的事务处理了,节省代码,我一直在这么使用,感觉运行不错
      
     
    ******************************
    如果能够在数据库中写事务我就不用这么麻烦了
      

  9.   

    GetMaxID 和 插入tbProject表的操作
    不能共用同一个连接