现有十条数据,要求一次性插入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;
}
}
}
注意:数据库不能改动,因为是在一个现有的系统上扩展功能的,所以绝对不能更改数据库表结构
其中用到事务,在程序中代码如下
//开始事务
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;
}
}
}
注意:数据库不能改动,因为是在一个现有的系统上扩展功能的,所以绝对不能更改数据库表结构
...
:
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;
}
{
transaction.Rollback();
throw en;
}
finally
{
connection.Close();
}
把当前表的最大id 放在 另一个表里.当用时去哪个表取,并具每次都是更新哪个表.这要在执行当有的语句时就和当前表没有关系了.就不会有死锁的现像,也能保证id 的唯一.以前做项目时经常是这么做的.///*************************///
这两年来慢慢习惯了光说不练
///*************************///
这个函数只是对表tbProject进行查询,并不涉及其他操作string strID = GetMaxID(connection,transaction);
可以试试
不过有点还不明白GetMaxID()为什么连查询都不行
为什么不直接使用sql server中的事务处理了,节省代码,我一直在这么使用,感觉运行不错
******************************
如果能够在数据库中写事务我就不用这么麻烦了
不能共用同一个连接