我正在用C(mysql)编写一个linux数据库应用程序,在我的代码中,我需要执行一些插入语句。假设(出于任何原因)某些插入过程中失败了。有一种简单的回滚方式吗?或唯一的方法是跟踪插入语句。
谢谢
顺便提一下,简化的代码片段和支持结构如下:#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]
}
}
答案 0 :(得分:3)
这正是为交易设计的目的。参见:
答案 1 :(得分:2)
您必须禁用自动提交,然后您可以使用函数mysql_commit()
和mysql_rollback()
来提交/回滚您的交易。