数据库 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事务详解(五)总结提高 引子 很多 ...
随机推荐
- 开源内容管理系统Joomla正式发布3.5版本 基于PHP 7
这也是首个完全支持 PHP 7 语言开发的 Joomla 版本 作为深受广大站长喜爱的 Joomla 开源内容管理系统(Content Management System, CMS)正式推出 3.5 ...
- PHPer转战Android的学习过程以及Android学习
原文作者: eoeadmin原文地址: http://my.eoe.cn/shuhai/archive/19684.html-------------------------------------- ...
- 安装PHP memcached扩展
引用 pecl.php.net有两个memcache扩展: memcache memcached extension memcached PHP extension for interfacing ...
- nat和打洞
http://michankong.blog.51cto.com/1464983/761270 可能有点乱,下面以故事的形式叙述一下这个情景. 人物:A(男) NAT_A(A家接线员) B(女) NA ...
- How do JavaScript closures work?
Like the old Albert Einstein said: If you can't explain it to a six-year-old, you really don't under ...
- gen_grant_sel.sql
set echo off feedback off verify off pagesize 0 linesize 120 define v_grantee=&1 define v_grant_ ...
- UITableView 性能优化
网络图片异步加载,SDWebImage. 文字直接 drawInRect/drawAtPoint 绘制,参考 ABTableViewCell,AdvancedTableViewCells. 本地图片也 ...
- Python大神成长之路: 第一次学习记录
一.Python发展史 二.Python2 or 3 博主选择了Python3. 从官网下载Python www.python.org Windows安装python3.5.python2.7.安装 ...
- Mac系统中各个文件夹简单介绍(转)
一.说明: Mac OS X,这是一个基于UNIX核心的系统,增强了系统的稳定性.性能以及响应能力.它能通过对称多处理技术充分发挥双处理器的优势,提供无与伦比的2D.3D和多媒体图形性能以及广泛的字体 ...
- thinkphp 5.0 模块设计
模块设计 5.0版本对模块的功能做了灵活设计,默认采用多模块的架构,并且支持单一模块设计,所有模块的命名空间均以app作为根命名空间(可配置更改). 目录结构 标准的应用和模块目录结构如下: ├─ap ...