页面上做了个按钮,触发获取数据,插入数据,更新等比较多的数据库操作事件,由于数据牵动到多个表,所以用了事务,第一回用事务,不太懂。
症状如下,事件触发后,数据库变慢了,尝试从sql查询窗口上delete或者select(反正是所有查询操作)数据时,执行查询变得非常慢。从查询窗口删除清空主表数据后,隔一段时间查询发现主表上数据在慢慢增多,这说明是刚才的操作还在继续,刷新网页也发觉原来没有数据的页面,数据也慢慢增多不太明白,为什么这么怪?下面是代码判断与操作主要流程:            for ()//第一层循环,得到数据
            {
                if ()//判断一下数据是否需要处理
                {
                    foreach ()//第二层循环数据,进行处理
                    {
                        if ()//某条件
                        {
                            try
                            {
                                if ()//某条件
                                {
                                }
                                if ()//如果不进入这个条件,程序执行的还是很快的
                                {
                                    using (DbConnection connection = DatabaseFactory.CreateDatabase().CreateConnection())
                                    {
                                        connection.Open();//这里打开,用了using,后面还需要close吗?
                                        DbTransaction dbTran = connection.BeginTransaction();//事务开始
                                        try
                                        {
                                            if ()//更新某数据表,如果更新不成功,回滚
                                            {
                                                dbTran.Rollback();
                                                continue;//因为失败了,用continue跳出这个循环,继续下次循环,对吗?
                                            }
                                            if ()//获得某数据表后的判断
                                            {
                                                if ()//插入数据到某表//如果更新不成功,回滚
                                                {
                                                    dbTran.Rollback();
                                                    continue;
                                                }
                                            }
                                            if ()//获得某数据表后的判断
                                            {
                                                if ()//插入数据到某表//如果更新不成功,回滚
                                                {
                                                    dbTran.Rollback();
                                                    continue;
                                                }
                                            }
                                            dbTran.Commit();//正常,提交事务
                                        }
                                        catch//异常,回滚
                                        {
                                            dbTran.Rollback();
                                        }
                                    }
                                }
                                else
                                {
                                }
                            }
                            catch (Exception ex)//捕获异常
                            {
                            }
                        }
                    }
                }
            }不知道是不是这个执行流程的层嵌的太深了?我没有更好的办法,因为确实流程需要这样。。也不知道我的事务是否用对了?上面也说了不进入那个事务流程,执行会很快
有可能是什么原因造成的?请各位指点下,谢谢了

解决方案 »

  1.   

    不好意思,各位请用高亮插件的源码方式看下,我里面注释用红字也标了些问题for ()//第一层循环,得到数据
    {
    if ()//判断一下数据是否需要处理
    {
    foreach ()//第二层循环数据,进行处理
    {
    if ()//某条件
    {
    try
    {
    if ()//某条件
    {
    }
    if ()<span style="color: #FF0000;">//如果不进入这个条件,程序执行的还是很快的</span>
    {
    using (DbConnection connection = DatabaseFactory.CreateDatabase().CreateConnection())
    {
    connection.Open();<span style="color: #FF0000;">//这里打开,用了using,后面还需要close吗?</span>
    DbTransaction dbTran = connection.BeginTransaction();//事务开始
    try
    {
    if ()//更新某数据表,如果更新不成功,回滚
    {
    dbTran.Rollback();
    continue;<span style="color: #FF0000;">//因为失败了,用continue跳出这个循环,继续下次循环,对吗?</span>
    }
    if ()//获得某数据表后的判断
    {
    if ()//插入数据到某表//如果更新不成功,回滚
    {
    dbTran.Rollback();
    continue;
    }
    }
    if ()//获得某数据表后的判断
    {
    if ()//插入数据到某表//如果更新不成功,回滚
    {
    dbTran.Rollback();
    continue;
    }
    }
    dbTran.Commit();//正常,提交事务
    }
    catch//异常,回滚
    {
    dbTran.Rollback();
    }
    }
    }
    else
    {
    }
    }
    catch (Exception ex)//捕获异常
    {
    }
    }
    }
    }
    }
      

  2.   

    分层处理下
    1.业务逻辑放一个层里面
    2.业务处理放一个层里面
    3.数据操作放一个层里面你这样看着乱,并且在数据操作和业务都放在一个里面,这样不怎么好。
    try catch 只放在真正的数据库操作里面就可以了。
      

  3.   

    你这里的层是指什么呢?是指vs里面的解决方案还是指我上面的代码块?
    因为我的处理是要看数据处理成什么样才能根据情况操作下一步,所以恐怕还是得有这么多判断,只是如果分一些层可能看着简单些(实际一样是引用函数而已,而且这些东西只在这个地方用,所以我想没必要将它放入层里面)
    try catch的用处是,因为数据比较多,有时候可能还是空的或者null的数据,可能会导致程序出错中止,所以我不想出现这样的错误界面,就try一下,直接跳过不知道我的想法对不对。
      

  4.   

    具体时间没有找过,上面代码里面有说了,如果不进入那个事务处理,还是很快的,现在进入那块,处理完我试过要20分钟以上,所以执行时间可能算不了,奇怪的问题是不止慢,还是我上面说的:数据操作好像排队延迟了一样,你在执行查询窗口delete了这个表的内容,隔一段时间再select一下,发现里面有内容,而且查询奇慢,里面只有几十条记录也要一分钟左右,说明这时候数据库资源消耗很大
      

  5.   

    我有些函数加了事务参数比如Addsth(model m, DbTransaction dbTran),如果dbtran传入null则不使用事务,现在我将上面的处理层,去掉事务之后,快很多,是正常的了,不知道为什么,所有事务就在上面那里代码,各位看看事务有什么问题?