启用事务操作,解决批量插入或更新sqlite,mssql等数据库耗时问题

13 篇文章 0 订阅
2 篇文章 0 订阅

循环数组,进行添加数据,更新的操作时,事务的做法:

首先接收值;
开启事务,
数组循环进行处理;
数组中的数据全部处理完成之后再提交;

/*------------------------------------------------------ */
//-- ecshop 事务处理---批量通过审核
/*------------------------------------------------------ */
elseif ($_REQUEST['act'] == 'batch_finish') {
    //批量通过  首先接收值  然后进行判断 只有状态值是0 的时候才能通过 0---1
    /* 检查权限 */
    admin_priv('surplus_manage');

    if (isset($_POST['checkboxes']) && count($_POST['checkboxes']) > 0) {
        $withdraw_list = $_POST['checkboxes'];

        /* 开始进行事务的处理 */
        $db->query('BEGIN');
        try {
            foreach ($withdraw_list as $key => $id) {
                /* 查询当前的预付款信息 */
                $account = array();
                $account = $db->getRow("SELECT * FROM " . $ecs->table('user_account') . " WHERE id = '$id'  FOR  UPDATE  ");
                $amount = $account['amount'];
                //如果状态为未确认
                if ($account['is_paid'] == 0) {
                    //点击的是【已完成】,更新此条记录,扣除相应的余额
                    $admin_note = '已完成';
                    $is_paid = 1;
                    update_user_account($id, $amount, $admin_note, $is_paid);
                    /* 记录管理员日志 */
                    admin_log('(' . addslashes($_LANG['checks']) . ')' . $admin_note, 'edit', 'user_surplus');
                }
            }
            $db->query('COMMIT');
        } catch (Exception $e) {
            $db->query('ROLLBACK');
            $message = $e->getMessage() ? $e->getMessage() : "操作失败!";
            sys_msg($message);
        }
        /* 提示信息 */
        $link[0]['text'] = $_LANG['11_user_withdraw'];
        $link[0]['href'] = 'user_withdraw.php?act=list&' . list_link_postfix();

        sys_msg($_LANG['attradd_succed'], 0, $link);
    } else {
        $lnk[] = array('text' => $_LANG['go_back'], 'href' => 'user_withdraw.php?act=list');
        sys_msg($_LANG['no_select_id'], 0, $lnk);
    }
}
private void button1_Click(object sender, EventArgs e)  
{  
    //Sqlite使用事务批量操作 极大的提高速度  
    DateTime starttime = DateTime.Now;  
    using (SQLiteConnection con = new SQLiteConnection(connStr))  
    {  
        con.Open();  
        DbTransaction trans = con.BeginTransaction();//开始事务       
        SQLiteCommand cmd = new SQLiteCommand(con);  
        try  
        {  
            cmd.CommandText = "INSERT INTO MyTable(username,useraddr,userage) VALUES(@a,@b,@c)";  
            for (int n = 0; n < 100000; n++)  
            {  
                cmd.Parameters.Add(new SQLiteParameter("@a", DbType.String)); //MySql 使用MySqlDbType.String  
                cmd.Parameters.Add(new SQLiteParameter("@b", DbType.String)); //MySql 引用MySql.Data.dll  
                cmd.Parameters.Add(new SQLiteParameter("@c", DbType.String));  
                cmd.Parameters["@a"].Value = "张三" + n;  
                cmd.Parameters["@b"].Value = "深圳" + n;  
                cmd.Parameters["@c"].Value = 10 + n;  
                cmd.ExecuteNonQuery();  
            }  
            trans.Commit();//提交事务    
            DateTime endtime = DateTime.Now;  
            MessageBox.Show("插入成功,用时" + (endtime - starttime).TotalMilliseconds);  

        }  
        catch(Exception ex)  
        {  
            MessageBox.Show(ex.Message);  
        }  
    }  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值