当一次业务处理计算服务和数据库交互较多时,将可能有大量时间浪费在数据传输上,尤其对于计算服务和数据库跨机房或跨地区部署时,浪费的时间会极其可观。为了减少时间浪费可以使用MySQL提供的SQL打包功能。

先来认识两个标记:
CLIENT_MULTI_RESULTS:Tell the server that the client can handle multiple result sets from multiple-statement executions or stored procedures. This flag is automatically enabled if CLIENT_MULTI_STATEMENTS is enabled.
CLIENT_MULTI_STATEMENTS:Tell the server that the client may send multiple statements in a single string (separated by “;”). If this flag is not set, multiple-statement execution is disabled.

接下来通过一个例子了解如何使用MySQL这个功能:

新建表结构:

字段 类型 描述
id bigint(20) unsigned 自增ID,主键
trans_id varchar(32) 业务单据号,唯一索引
comments text 备注

主要代码:

#include <stdio.h>
#include <string.h>
#include "mysql.h" int main(int argc, const char* argv[])
{
bool deal_ok = true; MYSQL* db_session = ; // init db
if (deal_ok)
{
db_session = mysql_init(db_session); if ( != db_session)
{
printf("init db\n");
}
else
{
deal_ok = false;
printf(" init db error\n");
}
} //connect db
if (deal_ok)
{
char db_host[] = {"127.0.0.1"};
char db_user[] = {"test"};
char db_pass[] = {""};
unsigned long db_port = ;
unsigned long conn_flag = CLIENT_MULTI_STATEMENTS | CLIENT_REMEMBER_OPTIONS; if (mysql_real_connect(db_session, db_host, db_user, db_pass, , db_port, , conn_flag))
{
printf("connect successed\n");
}
else
{
deal_ok = false;
printf("connect error: %s\n", mysql_error(db_session));
}
} //start transaction
if (deal_ok)
{
int db_ret = mysql_query(db_session, "START TRANSACTION");
if ( == db_ret)
{
printf("start transaction\n");
}
else
{
deal_ok = false;
printf("start transaction error: %s\n", mysql_error(db_session));
}
} //operate db
if (deal_ok)
{
char db_sql[] = {};
strcat(db_sql, "INSERT INTO test_db.test(trans_id, comments) VALUES(110, 'test');");
strcat(db_sql, "UPDATE test_db.test SET comments = 'modify' WHERE trans_id = '108';"); printf("operate db: %s\n", db_sql); int db_ret = mysql_real_query(db_session, db_sql, strlen(db_sql));
if ( == db_ret)
{
while ( == db_ret)
{
          int affected_rows = (int)mysql_affected_rows(db_session);
          deal_ok = deal_ok && (0 < affected_rows);
printf(" affected rows : %d\n", affected_rows); db_ret = mysql_next_result(db_session);
}
}
else
{
deal_ok = false;
printf("\terror: %s\n", mysql_error(db_session));
}
} //complete transaction
if ( != db_session)
{
if (deal_ok)
{
mysql_commit(db_session);
printf("commit\n");
}
else
{
mysql_rollback(db_session);
printf("rollback\n");
} mysql_close(db_session);
} return ;
}

MySQL打包执行SQL的更多相关文章

  1. MySQL命令执行sql文件的两种方法

    MySQL命令执行sql文件的两种方法 摘要:和其他数据库一样,MySQL也提供了命令执行sql脚本文件,方便地进行数据库.表以及数据等各种操作.下面笔者讲解MySQL执行sql文件命令的两种方法,希 ...

  2. MySQL中执行sql语句错误 Error Code: 1093. You can't specify target table 'car' for update in FROM clause

    MySQL中执行sql语句错误 Error Code: 1093. You can't specify target table 'car' for update in FROM clause 201 ...

  3. mysql批量执行sql文件

    1.待执行的sql文件为1.sql.2.sql.3.sql.4.sql等 2.写一个batch.sql文件: source .sql; source .sql; source .sql; source ...

  4. MySQL学习系列一---命令行连接mysql和执行sql文件

    1.命令行连接mysql #mysql -h(主机) -u(用户名) -p (数据库名) mysql -hlocalhost -uroot -p testdb Enter password: **** ...

  5. Python连接MySQL数据库执行sql语句时的参数问题

    由于工作需要,今天写了一个Python小脚本,其中需要连接MySQL数据库,在执行sql命令时需要传递参数,结果出问题了.在网上查了一下,发现有以下几种方式传递参数: 一.直接把sql查询语句完整写入 ...

  6. mysql source 执行sql脚本,中文变量不显示问题或乱码问题

    执行脚本内容如下: SET @pre_version=2017080901; SET @cur_version=2017090401; SET @ver_desc = '测试脚本'; CALL pro ...

  7. Entity Framework 在MySQL中执行SQL语句,关于参数问题

    在Entity Framework中添加MySQL模型,在写代码的过程中需要直接执行SQL语句. 在SQL语句中用到了@curRank := 0 这样在SQL语句中定义参数,同时还会有传入参数:ai. ...

  8. JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

    conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("trunca ...

  9. (转载)MySQL中执行sql语句反斜杠需要进行转义否则会被吃掉

    (转载)http://www.phpcode8.com/lamp/mysql-lamp/mysql-escape-slash.html 最近在执行一个sql备份的还原后,发现系统的部分路径找不到,于是 ...

随机推荐

  1. ext前后台数据传输的标准化

    一.标准化的数据传输是什么 这里所说的标准化主要是指,使用代理提交数据时,格式必须统一化.标准化,而服务器返回的数据格式也必须是标准化的数据. 简言之,使用代理提交数据时,前台--->后台,后台 ...

  2. 扫码下单支持同桌单人点餐FAQ

    一.使用场景 满足较多商户希望同一桌台,各自点各自的菜品的业态场景(例如杭味面馆,黄焖鸡米饭店,面馆等大多数轻快餐店) 二.配置步骤及注意事项 管理员后台配置--配置管理--店铺配置--扫码点餐tab ...

  3. Oracle下载与Oracle安装图解(Oracle19c,Oracle18c,Oracle12c,Oracle11g)

    Oracle下载与Oracle安装图解(Oracle19c,Oracle18c,Oracle12c,Oracle11g) 1.Oracle下载(Oracle11g) oracle下载方法,请根据以下步 ...

  4. C# 当前 .NET SDK 不支持将 .NET Core 2.1 设置为目标。请将 .NET Core 2.0 或更低版本设置为目标,或使用支持 .NET Core 2.1 的 .NET SDK 版本。

    报错信息: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 NETSDK1045 当前 .NET SDK 不支持将 .NET Core 2.2 设置为目标.请将 .NET Core 2.1 或 ...

  5. sqlsever存储过程配合代理作业自动定时建表

    1.自动建表存储过程 USE [ThreeToOne] GO /****** Object:  StoredProcedure [dbo].[WTO_CreateTable_ScanDoXXX]    ...

  6. vue(7)—— 组件化开发 — webpack(1)

    引子 在研究完前面的vue开发后,其实已经可以自己开发点东西了,靠前面的指令集,组件,还有vue-router,还有异步请求这些知识点,是完全可以开发出来的,完全可以达到时下前后端分离的效果. 但是, ...

  7. zabbix监控交换机状态

    1.在Zabbix中添加主机 输入名称.群组和交换机IP(交换机要开启snmp) 2.创建监控项 输入OID和其它信息(键值随便填,但是不能和系统内的键值重复)OID获取方法可查看上一篇文章:http ...

  8. Java 环境下载设置

    本篇文章出处: http://www.cnblogs.com/xiaofeixiang/p/4085159.html 和 https://www.cnblogs.com/renqiqiang/p/68 ...

  9. 一款回到顶部的 jQuery 插件,支持 Div 中的滚动条回到顶部

    前言 今天在网上搜索“回到顶部”的 jQuery 插件,网上有很多,但是大部分都不支持让 Div 中的滚动条回到顶部.于是乎,不放弃,自己参考 Github 上的一个 jQuery 插件,经过自己的修 ...

  10. Python多线程操作

    多线程是一门编程语言的重要操作. GIL(全局解释器锁)存在于python解释器中,用来确保当前只有一个线程被执行,当一个线程获得GIL后,这个线程将被执行,退出时释放GIL,由下一个获得GIL的线程 ...