最近在做sqlite3的二次开发,看到API里面关于事务的时候,萌生了测试一下事务的开启与否对插入数据所需要的时间影响的想法,根据sqlite3的api,在后面测试的时候发现对于sqlite3来说事务的开启与否仅插入1w条数据,时间的差距就已经非常非常明显了,先说下测试环境:ubuntu
12.04, sqlite3 3.7.14.1,测试插入1w条数据。
不开启事务时的测试代码如下:
int
insert_no_trans()
{
printf("<--------------------->
\n"
"go into
function insert_no_trans()\n");
int j =
0;
for (j = 0;
j < 10000; j++)
{
sprintf(sql,
"INSERT INTO [dev] ([id], [name], [age])\
values (%d,
'%s', %d)", j, "JGood", j);
if(SQLITE_OK
!= sqlite3_exec
(conn, sql,
0, 0, &err_msg))
{
fprintf(stderr, "INSERT ERROR: %s\n", err_msg);
exit(EXIT_FAILURE);
}
}
printf("INSERT all succussfully!\n");
printf("function insert_no_trans() end. \n"
"<---------------------> \n");
return
EXIT_SUCCESS;
}
开启事务的测试代码如下:
int
insert_with_trans()
{
printf("<--------------------->
\n"
"go into
function insert_with_trans()\n");
sqlite3_exec(conn, "begin;", 0, 0, 0);
//开启事务
int j =
0;
for (j = 0;
j < 10000; j++)
{
sprintf(sql,
"INSERT INTO [dev] ([id], [name], [age])\
values (%d,
'%s', %d)", j, "JGood", j);
if(SQLITE_OK
!= sqlite3_exec(conn, sql, 0, 0, &err_msg))
{
is_succeed =
false; //失败之后把标识设为false
fprintf(stderr, "INSERT ERROR: %s\n", err_msg);
break;
}