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. System.Web.Optimization找不到引用怎么办?

    Install-Package Microsoft.AspNet.Web.Optimization

  2. mysql建表: 主键,外键约束

    CREATE DATABASE db_studentinfo; USE db_studentinfo ; DROP TABLE IF EXISTS t_student ; CREATE TABLE t ...

  3. ACL in 和 out 区别 (重要)

    acl中in和out的区别   in和out是相对的,比如: A(s0)-----(s0)B(s1)--------(s1)C   www.2cto.com   假设你现在想拒绝A访问C,并且假设要求 ...

  4. vim Podfile

    platform :ios, "7.0"pod "AFNetworking"pod "SDWebImage"pod "SVProg ...

  5. Matplotlib中文显示的问题

    原文地址:http://blog.csdn.net/rumswell/article/details/6544377 #Matplotlib中文显示有问题,当然可以修改配置文件matplotlibrc ...

  6. CSS中关于margin的理解误区

    思考一 在以前,我对于margin的理解是这样的,此处用margin-top举例:指的是离相邻元素之间的距离. 但是实际是:相对于自身原来的位置偏移. 举个例子: <!DOCTYPE HTML ...

  7. 《accelerated c++》第九章---设计类

    本章简单介绍了类的设计,但是包含了一些好的设计原则. 1一些通用的设计原则 (1)一个函数是否设计成成员函数的原则:如果这个函数改变对象的状态,那么这个函数就应该成为这个对象的成员. (2)对于内置类 ...

  8. 关于源码编译每次提示有错误 要make update-api

    最近编译newline的版本的时候..同事修改了andoid默认输入法为百度.这是系统自动提供的API,所以每次编译会提示 此时在编译源码生成SDK的过程中会出现这个问题:************** ...

  9. jQuery常用的查找Dom元素方法

    废话不多说,先来个总结,然后下面是demo 一. 同级节点之间的检索(检索深度N=0) next()是在兄弟节点中,往后匹配; prev()是在兄弟节点中,往前匹配. 二. 父级/子级节点的检索(检索 ...

  10. JS传递到后台中文 出现乱码问题

    js 异步传递中文字符,后台接收出现乱码问题 function showFirSelect(a){ var b = encodeURI(a); var secUrl = "<%=bas ...