您的位置:首页 > 数据库 > MySQL

数据库 Mysql事务详解

2017-01-16 13:53 597 查看
Mysql事务
mysql的事务默认是自动提交的,也就是你提交一个query,他就直接执行!我们可以通过
set autocommit=0  禁止自动提交
set autocommit=1  开启自动提交


//mysql事务
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <mysql/mysql.h>

#define BEGIN_TRAN "START TRANSACTION"
#define SET_UNAUTO "SET AUTOCOMMIT=0"
#define SET_AUTO "SET AUTOCOMMIT=1"
#define COMMIT_TRAN "COMMIT"
#define ROLLBACK_TRAN "ROLLBACK"

/**
* mysql_mbegintran - 开启事务
* @conn:MYSQL对象指针
* 成功返回0,失败返回错误码
* */
int mysql_mbegintran(MYSQL *conn)
{
int ret = 0;
//执行事务开始SQL
ret = mysql_query(conn, BEGIN_TRAN);
if (ret != 0)
{
printf("mysql_query() failed ! error message:%s\n", mysql_error(conn));
return ret;
}
//mysql默认事务自动提交,现在设置事务手动提交
ret = mysql_query(conn, SET_UNAUTO);
if (ret != 0)
{
printf("mysql_query() failed ! error message:%s\n", mysql_error(conn));
return ret;
}
return ret;
}

/**
* mysql_mrollback - 事务回滚
* @conn:MYSQL对象指针
* 成功返回0,失败返回错误码
* */
int mysql_mrollback(MYSQL *conn)
{
int ret = 0;
//执行回滚SQL
ret = mysql_query(conn, ROLLBACK_TRAN);
if (ret != 0)
{
printf("mysql_query() failed ! error message:%s\n", mysql_error(conn));
return ret;
}
//恢复mysql执行SQL默认提交操作
ret = mysql_query(conn, SET_AUTO);
if (ret != 0)
{
printf("mysql_query() failed ! error message:%s\n", mysql_error(conn));
return ret;
}
return ret;
}

/**
* mysql_mcommit - 事务提交
* @conn:MYSQL对象指针
* 成功返回0,失败返回错误码
* */
int mysql_mcommit(MYSQL *conn)
{
int ret = 0;
//执行提交SQL
ret = mysql_query(conn, COMMIT_TRAN);
if (ret != 0)
{
printf("mysql_query() failed ! error message:%s\n", mysql_error(conn));
return ret;
}
//恢复mysql执行SQL默认提交操作
ret = mysql_query(conn, SET_AUTO);
if (ret != 0)
{
printf("mysql_query() failed ! error message:%s\n", mysql_error(conn));
return ret;
}
return ret;
}

int main(int arg, char *args[])
{
MYSQL mysql, *conn;
conn = mysql_init(&mysql);
conn = mysql_real_connect(&mysql, "localhost", "dbuser1", "123456", "db1",
0, 0, 0);
if (conn == NULL)
{
/*mysql_error()打印错误原因*/
printf("mysql_real_connect() failed ! error message:%s \n",
mysql_error(&mysql));
return -1;
}
printf("connect db server ok !\n");
//设置字符集
if (mysql_query(conn, "set names utf8") != 0)
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -1;
}
//开启事务
if (mysql_mbegintran(conn) != 0)
{
return -1;
}
//执行多条插入语句
if (mysql_query(conn,
"insert into student (name,passwd,classid) values('小米','123',10)")
!= 0)
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -1;
}
if (mysql_query(conn,
"insert into student (name,passwd,classid) values('小红','123',20)")
!= 0)
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -1;
}
//提交事务
if (mysql_mcommit(conn) != 0)
{
return -1;
}
//开启事务
if (mysql_mbegintran(conn) != 0)
{
return -1;
}
//执行多条插入语句
if (mysql_query(conn,
"insert into student (name,passwd,classid) values('小黑','123',30)")
!= 0)
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -1;
}
if (mysql_query(conn,
"insert into student (name,passwd,classid) values('小飞','123',40)")
!= 0)
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -1;
}
//回滚事务
if (mysql_mrollback(conn) != 0)
{
return -1;
}
/*关闭mysql连接*/
mysql_close(conn);
return 0;
}


.SUFFIXES:.c .o
CC=gcc
SRCS=hello.c
OBJS=$(SRCS:.c=.o)
EXEC=hello

start:$(OBJS)
$(CC) -o $(EXEC) $(OBJS) -lmysqlclient
@echo "--------OK-------"
.c.o:
$(CC) -Wall -g -o $@ -c $<
clean:
rm -f $(OBJS)
rm -f $(EXEC)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: