Mysql 需要关于多个数据库插入操作的建议吗
我正在用C(mysql)编写一个linux数据库应用程序,在我的代码中,我需要执行一些insert语句。假设(出于任何原因)某些插入在过程中失败。有没有一种简单的方法可以回退?或者,唯一的方法是跟踪insert语句 多谢各位 顺便说一下,简化的代码和支持结构如下:Mysql 需要关于多个数据库插入操作的建议吗,mysql,sql,c,linux,Mysql,Sql,C,Linux,我正在用C(mysql)编写一个linux数据库应用程序,在我的代码中,我需要执行一些insert语句。假设(出于任何原因)某些插入在过程中失败。有没有一种简单的方法可以回退?或者,唯一的方法是跟踪insert语句 多谢各位 顺便说一下,简化的代码和支持结构如下: #include <my_global.h> #include <mysql.h> #define MAX_RECORDS_FIELD_SIZE 150 #define MAX_RECORDS_VALUES_
#include <my_global.h>
#include <mysql.h>
#define MAX_RECORDS_FIELD_SIZE 150
#define MAX_RECORDS_VALUES_SIZE 300
typedef struct
{
char connectionString[100];
char username[30];
MYSQL *conn;
}connection;
typedef struct
{
char table_name[30];
int nof_fields;
void * fields;
void * values;
}record;
typedef struct
{
int nof_records;
record *_record;
}records;
//this function can insert value into various records
int insert(connection _connection, records _records,void * _other)
{
int i=0,j=0,m=0,n;
char *str[100],fields[MAX_RECORDS_FIELD_SIZE],values[MAX_RECORDS_VALUES_SIZE];
for(i=0;i<_records.nof_records;i++)
{
m=_records._record[i].nof_fields;
if(m>0) sprintf(fields,"%s",_records._record[i]->fields[0]);
if(m>0) sprintf(fields,"%s",_records._record[i]->values[0]);
for(j=1;j<m;j++)
{
sprintf(fields,"%s,%s",fields,_records._record[i]->fields[j]);
sprintf(values,"%s,%s",fields,_records._record[i]->values[j]);
}
str[i]=calloc(1,sizeof(char)*(strlen(fields)+strlen(values)));
sprintf(str[i],"insert into %s (%s) values(%s)",_records._record[i]->table_name,fields,values);
}
for(i=0;i<_records.nof_records;i++)
{
//do the insertion of str[i]
// **error! what to do? how to roll back?**
//free str[i]
}
}
#包括
#包括
#定义最大记录数字段大小150
#定义最大\u记录\u值\u大小300
类型定义结构
{
字符连接字符串[100];
字符用户名[30];
MYSQL*康涅狄格州;
}联系;
类型定义结构
{
字符表_名称[30];
int nof_字段;
空白*字段;
void*值;
}记录;
类型定义结构
{
int nof_记录;
记录*\u记录;
}记录;
//此函数可以将值插入到各种记录中
int insert(连接-连接,记录-记录,无效*\u其他)
{
int i=0,j=0,m=0,n;
char*str[100],字段[MAX\u RECORDS\u FIELD\u SIZE],值[MAX\u RECORDS\u values\u SIZE];
对于(i=0;i0)sprintf(字段,“%s”,_记录。_记录[i]->字段[0]);
如果(m>0)sprintf(字段,“%s”,_记录。_记录[i]->值[0]);
对于(j=1;jfields[j]);
sprintf(值,“%s,%s”,字段,_记录._记录[i]->值[j]);
}
str[i]=calloc(1,sizeof(char)*(strlen(字段)+strlen(值));
sprintf(str[i],“插入%s(%s)值(%s)”,\u记录。\u记录[i]->表\u名称、字段、值);
}
对于(i=0;i您必须禁用自动提交,然后才能使用函数和提交/回滚事务。您必须禁用自动提交,然后才能使用函数和提交/回滚事务。这正是事务设计的目的。请参阅:
这正是事务设计的目的。请参阅:
老兄-接受你收到的一些回答-向帮助你的人表达爱意我很抱歉,但我没有理解你!我确实感谢回答我的人。我也发表了一些评论。我做错了什么吗?或者…我应该做一些我没有做的事情吗?如果是这样,请让我知道,因为我是stackoverflow的新用户。我们你说的是否决票/否决票和接受票吗?我现在才想起来:)你应该点击答案旁边的复选框“接受”正确的答案。在点击复选框之前,你应该仔细考虑哪个答案是最好的。伙计-接受你收到的一些答案-向帮助你的人表达一些爱我很抱歉,但我没有理解你!我确实感谢那些回答我的人。并发表了一些评论。我做错什么了吗?或我应该做些我没有做的事吗?如果是这样,请让我知道,因为我是一个新的stackoverflow用户。你是说投票否决/投票赞成并接受吗?我现在才想起来:)你应该点击答案旁边的复选框来“接受”正确的答案。在单击复选框之前,您应该仔细考虑哪个答案是最好的。谢谢,我尝试了以下方法,但没有成功(程序仍然执行插入)。我遗漏了什么:mysql\u自动提交(康涅狄格州,0);mysql_查询(conn,“启动事务”);mysql_查询(conn,“插入写入程序值('Honore')”);mysql_回滚(conn);//mysql_查询(conn,“COMMIT”);关闭(康涅狄格州);更新:正如mysql_rollback()手册所说:“从mysql 5.0.3开始,此函数的操作取决于completion_type系统变量的值。”这与我的情况相关吗?我可以在哪里设置它?谢谢,我尝试了以下方法,但没有成功(程序仍然进行插入)。我遗漏了什么:mysql\u自动提交(康涅狄格州,0);mysql_查询(conn,“启动事务”);mysql_查询(conn,“插入写入程序值('Honore')”);mysql_回滚(conn);//mysql_查询(conn,“COMMIT”);关闭(康涅狄格州);更新:正如mysql_rollback()手册所说:“从mysql 5.0.3开始,此函数的操作取决于completion_type系统变量的值。”这与我的情况相关吗?我可以在哪里设置它?谢谢,我尝试了以下方法,但没有成功(程序仍然进行插入)。我遗漏了什么:mysql\u自动提交(康涅狄格州,0);mysql_查询(conn,“启动事务”);mysql_查询(conn,“插入写入程序值('Honore')”);mysql_回滚(conn);关闭(康涅狄格州);更新:正如mysql_rollback()手册所说:“从mysql 5.0.3开始,此函数的操作取决于completion_type系统变量的值。”这与我的情况相关吗?我可以在哪里设置它?不幸的是,我以前没有使用过MySQL事务,并且我没有立即发现您的代码有任何错误,所以我不知道。也许可以尝试执行mysql\u查询(conn,“ROLLBACK”)代码>?我想你应该用你的新问题问一个新问题。谢谢,我尝试了以下方法,但没有成功(程序仍在插入)。我遗漏了什么:mysql\u自动提交(康涅狄格州,0);mysql_查询(conn,“启动事务”);mysql_查询(conn,“插入写入程序值('Honore')”);mysql_回滚(conn);关闭(康涅狄格州);更新:正如mysql_rollback()手册所说:“从mysql 5.0.3开始,此函数的操作取决于completion_type系统变量的值。”这与我的情况相关吗?我可以在哪里设置它?不幸的是,我以前没有使用过MySQL事务,并且我没有立即发现您的代码有任何错误,所以我不知道。也许可以尝试执行mysql\u查询(conn,“ROLLBACK”)代码>?我认为你应该用你的新问题问一个新问题。