zoukankan      html  css  js  c++  java
  • 数据库 Mysql事务详解

    Mysql事务
    mysql的事务默认是自动提交的,也就是你提交一个query,他就直接执行!我们可以通过
    set autocommit=0  禁止自动提交
    set autocommit=1  开启自动提交
    //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 = 0;
        //执行事务开始SQL
        ret = mysql_query(conn, BEGIN_TRAN);
        if (ret != 0)
        {
            printf("mysql_query() failed ! error message:%s
    ", mysql_error(conn));
            return ret;
        }
        //mysql默认事务自动提交,现在设置事务手动提交
        ret = mysql_query(conn, SET_UNAUTO);
        if (ret != 0)
        {
            printf("mysql_query() failed ! error message:%s
    ", mysql_error(conn));
            return ret;
        }
        return ret;
    }
    
    /**
     * mysql_mrollback - 事务回滚
     * @conn:MYSQL对象指针
     * 成功返回0,失败返回错误码
     * */
    int mysql_mrollback(MYSQL *conn)
    {
        int ret = 0;
        //执行回滚SQL
        ret = mysql_query(conn, ROLLBACK_TRAN);
        if (ret != 0)
        {
            printf("mysql_query() failed ! error message:%s
    ", mysql_error(conn));
            return ret;
        }
        //恢复mysql执行SQL默认提交操作
        ret = mysql_query(conn, SET_AUTO);
        if (ret != 0)
        {
            printf("mysql_query() failed ! error message:%s
    ", mysql_error(conn));
            return ret;
        }
        return ret;
    }
    
    /**
     * mysql_mcommit - 事务提交
     * @conn:MYSQL对象指针
     * 成功返回0,失败返回错误码
     * */
    int mysql_mcommit(MYSQL *conn)
    {
        int ret = 0;
        //执行提交SQL
        ret = mysql_query(conn, COMMIT_TRAN);
        if (ret != 0)
        {
            printf("mysql_query() failed ! error message:%s
    ", mysql_error(conn));
            return ret;
        }
        //恢复mysql执行SQL默认提交操作
        ret = mysql_query(conn, SET_AUTO);
        if (ret != 0)
        {
            printf("mysql_query() failed ! error message:%s
    ", 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", "123456", "db1",
                0, 0, 0);
        if (conn == NULL)
        {
            /*mysql_error()打印错误原因*/
            printf("mysql_real_connect() failed ! error message:%s 
    ",
                    mysql_error(&mysql));
            return -1;
        }
        printf("connect db server ok !
    ");
        //设置字符集
        if (mysql_query(conn, "set names utf8") != 0)
        {
            printf("mysql_query() failed ! error message:%s 
    ",
                    mysql_error(&mysql));
            return -1;
        }
        //开启事务
        if (mysql_mbegintran(conn) != 0)
        {
            return -1;
        }
        //执行多条插入语句
        if (mysql_query(conn,
                "insert into student (name,passwd,classid) values('小米','123',10)")
                != 0)
        {
            printf("mysql_query() failed ! error message:%s 
    ",
                    mysql_error(&mysql));
            return -1;
        }
        if (mysql_query(conn,
                "insert into student (name,passwd,classid) values('小红','123',20)")
                != 0)
        {
            printf("mysql_query() failed ! error message:%s 
    ",
                    mysql_error(&mysql));
            return -1;
        }
        //提交事务
        if (mysql_mcommit(conn) != 0)
        {
            return -1;
        }
        //开启事务
        if (mysql_mbegintran(conn) != 0)
        {
            return -1;
        }
        //执行多条插入语句
        if (mysql_query(conn,
                "insert into student (name,passwd,classid) values('小黑','123',30)")
                != 0)
        {
            printf("mysql_query() failed ! error message:%s 
    ",
                    mysql_error(&mysql));
            return -1;
        }
        if (mysql_query(conn,
                "insert into student (name,passwd,classid) values('小飞','123',40)")
                != 0)
        {
            printf("mysql_query() failed ! error message:%s 
    ",
                    mysql_error(&mysql));
            return -1;
        }
        //回滚事务
        if (mysql_mrollback(conn) != 0)
        {
            return -1;
        }
        /*关闭mysql连接*/
        mysql_close(conn);
        return 0;
    }
    .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)
  • 相关阅读:
    【HAOI2014】走出金字塔
    【HAOI2008】圆上的整点
    LOJ #116 有源汇点有上下界的最大流
    ZOJ [P2314] 无源汇点有上下界模版
    最小费用最大流模版
    最大流模版 dinic
    最大流模版 EK
    HDU [P1533]
    HDU [2255] 奔小康赚大钱
    POJ [P2289] Jamie's Contact Groups
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/6289359.html
Copyright © 2011-2022 走看看