页面上做了个按钮,触发获取数据,插入数据,更新等比较多的数据库操作事件,由于数据牵动到多个表,所以用了事务,第一回用事务,不太懂。
症状如下,事件触发后,数据库变慢了,尝试从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)//捕获异常
{
}
}
}
}
}不知道是不是这个执行流程的层嵌的太深了?我没有更好的办法,因为确实流程需要这样。。也不知道我的事务是否用对了?上面也说了不进入那个事务流程,执行会很快
有可能是什么原因造成的?请各位指点下,谢谢了
症状如下,事件触发后,数据库变慢了,尝试从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)//捕获异常
{
}
}
}
}
}不知道是不是这个执行流程的层嵌的太深了?我没有更好的办法,因为确实流程需要这样。。也不知道我的事务是否用对了?上面也说了不进入那个事务流程,执行会很快
有可能是什么原因造成的?请各位指点下,谢谢了
解决方案 »
- 求救VB和C#都通的高手!!!(FOR循环转不过来,则样在C#中实现object型变量进行for循环)
- ContextMenuStrip 问题!
- 无法用using自动添加命名空间的问题
- 关于通过DataSet更新源数据的问题
- 求VS2010安装包...
- 问一个关于开发信息共享系统(跟oa差不多)的问题
- 谁见过报这样的错误:"没有可用于当前位置的源代码。"
- 用C#怎样实现遗传算法?
- 在WinForm中使用WebkitBrowser新窗口打开页面无法实现
- 关于两个DataSet的Merge方法问题:Merge后为什么数据库数据表的数据没有变化?
- DataGridView的一些问题,求大大
- ACCESS数据库中支持这样的语法吗?
{
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)//捕获异常
{
}
}
}
}
}
1.业务逻辑放一个层里面
2.业务处理放一个层里面
3.数据操作放一个层里面你这样看着乱,并且在数据操作和业务都放在一个里面,这样不怎么好。
try catch 只放在真正的数据库操作里面就可以了。
因为我的处理是要看数据处理成什么样才能根据情况操作下一步,所以恐怕还是得有这么多判断,只是如果分一些层可能看着简单些(实际一样是引用函数而已,而且这些东西只在这个地方用,所以我想没必要将它放入层里面)
try catch的用处是,因为数据比较多,有时候可能还是空的或者null的数据,可能会导致程序出错中止,所以我不想出现这样的错误界面,就try一下,直接跳过不知道我的想法对不对。