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事务详解的更多相关文章

  1. mysql由浅入深探究(四)----mysql事务详解

    什么是事务: 通俗的解释就是对数据库进行的一组完整的操作,这组完整的操作中包含一个或多个操作.解释的太low了,来点官方的:事务就是DBMS中执行的一个完整的逻辑单元,这个逻辑单元中包含一个或者多个操 ...

  2. mysql事务详解

    事务的四大特性ACID如下:       原子性:事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作.如果在执行的过程中发了错误,要回滚(Rollback)到事务开始前的状态,就像这个 ...

  3. PHP mysql与mysqli事务详解

    官方对PHP连接到MySQL数据库服务器的三种主要的API简介如下: http://php.net/manual/zh/mysqli.overview.php PHP mysql与mysqli事务详解 ...

  4. 重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现

    重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现 说到锁机制之前,先来看看Mysql的存储引擎,毕竟不同的引擎的锁机制也随着不同. 三类常见引擎: MyIsam :不支持事务,不 ...

  5. MySQL 数据类型 详解

    MySQL 数据类型 详解 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 My ...

  6. MySQL配置文件详解

    MYSQL 配置文件详解 “全局缓存”.“线程缓存”,全局缓存是所有线程共享,线程缓存是每个线程连接上数据时创建一个线程(如果没有设置线程池),假如有200连接.那就是200个线程,如果参数设定值是1 ...

  7. spring事务详解(五)总结提高

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.概念 ...

  8. spring事务详解(四)测试验证

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...

  9. spring事务详解(一)初探事务

    系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 引子 很多 ...

随机推荐

  1. 开源内容管理系统Joomla正式发布3.5版本 基于PHP 7

    这也是首个完全支持 PHP 7 语言开发的 Joomla 版本 作为深受广大站长喜爱的 Joomla 开源内容管理系统(Content Management System, CMS)正式推出 3.5 ...

  2. PHPer转战Android的学习过程以及Android学习

    原文作者: eoeadmin原文地址: http://my.eoe.cn/shuhai/archive/19684.html-------------------------------------- ...

  3. 安装PHP memcached扩展

    引用 pecl.php.net有两个memcache扩展: memcache   memcached extension memcached PHP extension for interfacing ...

  4. nat和打洞

    http://michankong.blog.51cto.com/1464983/761270 可能有点乱,下面以故事的形式叙述一下这个情景. 人物:A(男) NAT_A(A家接线员) B(女) NA ...

  5. 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 ...

  6. gen_grant_sel.sql

    set echo off feedback off verify off pagesize 0 linesize 120 define v_grantee=&1 define v_grant_ ...

  7. UITableView 性能优化

    网络图片异步加载,SDWebImage. 文字直接 drawInRect/drawAtPoint 绘制,参考 ABTableViewCell,AdvancedTableViewCells. 本地图片也 ...

  8. Python大神成长之路: 第一次学习记录

    一.Python发展史 二.Python2 or 3 博主选择了Python3. 从官网下载Python  www.python.org Windows安装python3.5.python2.7.安装 ...

  9. Mac系统中各个文件夹简单介绍(转)

    一.说明: Mac OS X,这是一个基于UNIX核心的系统,增强了系统的稳定性.性能以及响应能力.它能通过对称多处理技术充分发挥双处理器的优势,提供无与伦比的2D.3D和多媒体图形性能以及广泛的字体 ...

  10. thinkphp 5.0 模块设计

    模块设计 5.0版本对模块的功能做了灵活设计,默认采用多模块的架构,并且支持单一模块设计,所有模块的命名空间均以app作为根命名空间(可配置更改). 目录结构 标准的应用和模块目录结构如下: ├─ap ...