数据库 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)
相关文章推荐
- [数据库事务与锁]详解六: MySQL中的共享锁与排他锁
- [数据库事务与锁]详解六: MySQL中的共享锁与排他锁
- 详解Mysql分布式事务XA(跨数据库事务)
- [数据库事务与锁]详解六: MySQL中的共享锁与排他锁
- [数据库事务与锁]详解六: MySQL中的共享锁与排他锁
- Net Core中数据库事务隔离详解——以Dapper和Mysql为例
- 详解Mysql分布式事务XA(跨数据库事务)
- mysql dba系统学习(22)数据库事务详解
- 详解Mysql分布式事务XA(跨数据库事务)
- [数据库事务与锁]详解六: MySQL中的共享锁与排他锁
- Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别
- mysql dba系统学习(22)数据库事务详解
- Mysql加锁过程详解(6)-数据库隔离级别(2)-通过例子理解事务的4种隔离级别
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
- 详解Mysql分布式事务XA(跨数据库事务)
- Net Core中数据库事务隔离详解——以Dapper和Mysql为例
- Mysql 主从数据库同步详解