数据库 Mysql事务详解
Mysql事务
mysql的事务默认是自动提交的,也就是你提交一个query,他就直接执行!我们可以通过
set autocommit= 禁止自动提交
set autocommit= 开启自动提交
//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 = ;
//执行事务开始SQL
ret = mysql_query(conn, BEGIN_TRAN);
if (ret != )
{
printf("mysql_query() failed ! error message:%s\n", mysql_error(conn));
return ret;
}
//mysql默认事务自动提交,现在设置事务手动提交
ret = mysql_query(conn, SET_UNAUTO);
if (ret != )
{
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 = ;
//执行回滚SQL
ret = mysql_query(conn, ROLLBACK_TRAN);
if (ret != )
{
printf("mysql_query() failed ! error message:%s\n", mysql_error(conn));
return ret;
}
//恢复mysql执行SQL默认提交操作
ret = mysql_query(conn, SET_AUTO);
if (ret != )
{
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 = ;
//执行提交SQL
ret = mysql_query(conn, COMMIT_TRAN);
if (ret != )
{
printf("mysql_query() failed ! error message:%s\n", mysql_error(conn));
return ret;
}
//恢复mysql执行SQL默认提交操作
ret = mysql_query(conn, SET_AUTO);
if (ret != )
{
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", "", "db1",
, , );
if (conn == NULL)
{
/*mysql_error()打印错误原因*/
printf("mysql_real_connect() failed ! error message:%s \n",
mysql_error(&mysql));
return -;
}
printf("connect db server ok !\n");
//设置字符集
if (mysql_query(conn, "set names utf8") != )
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -;
}
//开启事务
if (mysql_mbegintran(conn) != )
{
return -;
}
//执行多条插入语句
if (mysql_query(conn,
"insert into student (name,passwd,classid) values('小米','123',10)")
!= )
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -;
}
if (mysql_query(conn,
"insert into student (name,passwd,classid) values('小红','123',20)")
!= )
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -;
}
//提交事务
if (mysql_mcommit(conn) != )
{
return -;
}
//开启事务
if (mysql_mbegintran(conn) != )
{
return -;
}
//执行多条插入语句
if (mysql_query(conn,
"insert into student (name,passwd,classid) values('小黑','123',30)")
!= )
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -;
}
if (mysql_query(conn,
"insert into student (name,passwd,classid) values('小飞','123',40)")
!= )
{
printf("mysql_query() failed ! error message:%s \n",
mysql_error(&mysql));
return -;
}
//回滚事务
if (mysql_mrollback(conn) != )
{
return -;
}
/*关闭mysql连接*/
mysql_close(conn);
return ;
}
.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事务详解
什么是事务: 通俗的解释就是对数据库进行的一组完整的操作,这组完整的操作中包含一个或多个操作.解释的太low了,来点官方的:事务就是DBMS中执行的一个完整的逻辑单元,这个逻辑单元中包含一个或者多个操 ...
- mysql事务详解
事务的四大特性ACID如下: 原子性:事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作.如果在执行的过程中发了错误,要回滚(Rollback)到事务开始前的状态,就像这个 ...
- PHP mysql与mysqli事务详解
官方对PHP连接到MySQL数据库服务器的三种主要的API简介如下: http://php.net/manual/zh/mysqli.overview.php PHP mysql与mysqli事务详解 ...
- 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现
重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...
- MySQL 数据类型 详解
MySQL 数据类型 详解 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 My ...
- MySQL配置文件详解
MYSQL 配置文件详解 “全局缓存”.“线程缓存”,全局缓存是所有线程共享,线程缓存是每个线程连接上数据时创建一个线程(如果没有设置线程池),假如有200连接.那就是200个线程,如果参数设定值是1 ...
- spring事务详解(五)总结提高
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.概念 ...
- spring事务详解(四)测试验证
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- spring事务详解(一)初探事务
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 引子 很多 ...
随机推荐
- [原创] web_custom_request 与 Viewstate
在用loadrunner对.net编写的website进行性能测试时,经常会遇上一些hidden fields,例如,CSRFTOKEN.VIEWSTATE.EVENTVALIDATION等,而对于这 ...
- C# 初步学习
这学期有了C#开发这门课....先做了计算器,还有进制转换,别人看来似乎很强,其实在ACM中算是两个简单的水题了.....参加竞赛一年下来,发现学到的算法和数据结构都是十分有用的东西. 计算器最核心的 ...
- 用Visual Studio 2015 编写驱动之前一定要注意的问题!!!
如果你确定要使用Visual Studio 2015 编写驱动,那么在你安装Visual Studio 2015 和WDK之前,一定一定要注意一件事情,那就是确保SDK和WDK版本保持一致,切记切记! ...
- 忘了SA密码的SQL SERVER
[暂时还未验证] SQL2008 如果 本地连接登录补上,也忘了Sa等管理账号的密码,可以通过单用户连接的方式登录 http://msdn.microsoft.com/zh-cn/library/m ...
- STL笔记之【map之总概】
1.map和multimap内部数据结构: 红黑树(平衡二叉树的一种)2.在往map和multimap中插入元素时,会自动进行排序3.map和multimap的所有元素的key都被视为常数,其元素的实 ...
- DFS序的题目列表
所谓dfs序就是将之前的顺序进行修改,获得一个新的序列,然后再新的序列下进行一系列其他的操作 一般题目给你的都会是一棵树,然后点之间都是无关的,我们首要的任务就是先把这些序列重新排.然后再根据dfs的 ...
- CF 672 div2 D
http://codeforces.com/contest/672/problem/D 题目大意: 有n个人,每个人有pi的钱,然后可以由如下操作,每次都可以挑选一个最富有的人,把它的钱给最穷的人.但 ...
- Intergate flot with Angular js ——Angular 图形报表
下面这篇文章最终的结论就是 Flot 插件 结合 Angular 的Directive 来处理 图表的绘制 给出github上的一个demo源码.https://gist.github.com/fly ...
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random,ThreadLocalRandom 即: ...
- Java正则表达式细节1
Java中使用特定的字符类别比如 \d \s \w \d 匹配数字 \s 匹配空白字符 \w 匹配数字或者字符或者下划线[a-zA-Z0-9_] 比如使员正则的时候: 使用的是2个 斜杠 @Test ...