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. AngularJS 从零开始学习(一)

    什么是AngularJS? AngularJS是一个把HTML(视图)绑定到JavaScript对象(模型)上的框架.当模型改变时,页面也能自动随之更新,反之亦然.当某个域的内容发生变化时,与之关联的 ...

  2. 转:selenium webdriver 执行javascript代码

    在用selenium webdriver 编写web页面的自动化测试代码时,可能需要执行一些javascript代码,selenium本身就支持执行js,我们在代码中import org.openqa ...

  3. VIJOS P1081 野生动物园 SBT、划分树模板

    [描述] cjBBteam拥有一个很大的野生动物园.这个动物园坐落在一个狭长的山谷内,这个区域从南到北被划分成N个区域,每个区域都饲养着一头狮子.这些狮子从北到南编号为1,2,3,…,N.每头狮子都有 ...

  4. CSS样式覆盖规则

    有一下问题, 想让下面的border生效 ,#比. 优先级高, #navigator { height: 100%; width: 200; position: absolute; left: 0; ...

  5. PHP个人常用函数封装

    function GetIP(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])){ $cip = $_SERVER["HTTP_CLIEN ...

  6. UI和UE有什么区别呢?

    UCD(以用户为中心的设计)UE(用户体验)UI(用户界面)HCI(人机交互)usability(易用性)

  7. Android sdk content loader 0%的解决方案

    Eclipse在启动时,经常会碰到半天启动不起来的情况,罪魁祸首就是“Android sdk content loader 0%”,题主经常是受这玩意的百般折磨,大早上一来就被这扫了工作的激情,浪费了 ...

  8. C#入门经典-第15章Windows 编程

    在使用Windows窗体时,就是使用System.Windows.Forms名称空间. .NET中的大多数控件都派生于System.Windows.Forms.Control类.

  9. 关于window.location.href="delete_emp.do?id"+id;

    ?后面是参数 ?id 就是带参发送这个请求 参数就是id  后面的 +id 貌似 是值

  10. zf-关于更改账号密码的问题

    一般项目的数据库里都会有一个 SYS_USER表 里面有账号密码 一般 202……70 的都是123加密后的字符串 如果碰到项目运行之后不知道登陆密码的时候 可以在数据库中 把USER_PASS 改成 ...