Home  >  Article  >  Database  >  Transaction Concepts for Getting Started with MySQL

Transaction Concepts for Getting Started with MySQL

黄舟
黄舟Original
2017-01-19 15:40:031122browse

MYSQL automatically submits by default, that is, if you submit a QUERY, it will be executed directly! We can disable automatic submission by
set autocommit=0
set autocommit=1 to enable automatic submission
Only the INNODB engine in mysql supports transaction processing, and the default is automatic submission;
Another commonly used MYISAM The engine does not support transactions and has no concept of transactions.

It can be compared to the concept of Oracle transactions! ! !

You can avoid MySQL's automatic submission and encapsulate the API yourself to implement rollback and other operations! ! !

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <termios.h>
#include <mysql/mysql.h>
/*
MySQL set autocommit = 0或1分别什么啊,哪个是自动提交啊
要熟练使用mysql的帮助文档,在里面查找autocommit,就会有相应的注释,比我在这里直接给你说要深刻得多。
autocoomit是事务,根据mysql的文档如果等于1是立即提交。但在transction中只有遇到commit或rollback才提交。希望对你有用。
*/
/*
MYSQL默认是自动提交的,也就是你提交一个QUERY,它就直接执行!我们可以通过
     set autocommit=0  禁止自动提交
     set autocommit=1 开启自动提交 
mysql中INNODB引擎才支持事务处理,默认是自动提交的;
另外一种常用的MYISAM引擎是不支持事务的,本身就没有事务的概念 
*/
#define BEGIN_TRAN      "START TRANSACTION"
#define SET_TRAN            "SET AUTOCOMMIT=0"  
#define UNSET_TRAN      "SET AUTOCOMMIT=1"
#define COMMIT_TRAN     "COMMIT"
#define ROLLBACK_TRAN   "ROLLBACK"
int mysql_BeginTran(MYSQL *mysql)
{
    int ret = 0;
    //--执行事务开始SQL
    ret = mysql_query(mysql, BEGIN_TRAN);
    if (ret != 0)
    {
        printf("func mysql_query() err: %d\n", ret);
        return ret;
    }
    //--设置事务手动提交
    ret = mysql_query(mysql, SET_TRAN);
    if (ret != 0)
    {
        printf("func mysql_query() err: %d\n", ret);
        return ret;
    }
    return ret;
}
int mysql_Rollback(MYSQL *mysql)
{
    int ret = 0;
    //--事务回滚操作
    ret = mysql_query(mysql, ROLLBACK_TRAN);
    if (ret != 0)
    {
        printf("func mysql_query() err: %d\n", ret);
        return ret;
    }
    //--恢复事务自动提交标志
    ret = mysql_query(mysql, UNSET_TRAN);
    if (ret != 0)
    {
        printf("func mysql_query() err: %d\n", ret);
        return ret;
    }
    return ret;
}
int mysql_Commit(MYSQL *mysql)
{
    int ret = 0;
    //--执行事务提交SQL
    ret = mysql_query(mysql, COMMIT_TRAN);
    if (ret != 0)
    {
        printf("func mysql_query() err: %d\n", ret);
        return ret;
    }
    //--恢复自动提交设置
    ret = mysql_query(mysql, UNSET_TRAN);
    if (ret != 0)
    {
        printf("func mysql_query() err: %d\n", ret);
        return ret;
    }
    return ret;
}
// 建表 create table test_table(col1 int, col2 varchar(10), col3 varchar(10)); 
#define sql01 "INSERT INTO test_table(col1,col2,col3) VALUES(10, &#39;10&#39;, &#39;1&#39;)"
#define sql02 "INSERT INTO test_table(col1,col2,col3) VALUES(20, &#39;20&#39;, &#39;2&#39;)"
#define sql03 "INSERT INTO test_table(col1,col2,col3) VALUES(30, &#39;30&#39;, &#39;3&#39;)"
#define sql04 "INSERT INTO test_table(col1,col2,col3) VALUES(40, &#39;40&#39;, &#39;4&#39;)"
int main()
{
    int         ret = NULL;
    MYSQL       *mysql;
    MYSQL_RES   *res;
    MYSQL_ROW   row;
    char        *query;
    mysql = mysql_init(NULL);
    mysql =mysql_real_connect(mysql, "localhost", "root", "123456", "mydb2", 0, NULL, 0 );
    if (mysql == NULL)
    {
        ret = mysql_errno(mysql);
        printf("func mysql_real_connect() err\n");
        return ret;
    }
    else
    {
        printf(" ok......\n");
    }
    ret = mysql_BeginTran(mysql);
    if (ret != 0)
    {
        printf("mysql_BeginTran() err:%d\n", ret);
        return ret;
    }
    ret = mysql_query(mysql, sql01);
    if (ret != 0)
    {
        printf("mysql_query() err:%d\n", ret);
        return ret;
    }
    ret = mysql_query(mysql, sql02);
    if (ret != 0)
    {
        printf("mysql_query() err:%d\n", ret);
        return ret;
    }
    ret = mysql_Commit(mysql);
    if (ret != 0)
    {
        printf("mysql_Commit() err:%d\n", ret);
        return ret;
    }
    ret = mysql_BeginTran(mysql);
    if (ret != 0)
    {
        printf("mysql_BeginTran() err:%d\n", ret);
        return ret;
    }
    ret = mysql_query(mysql, sql03);
    if (ret != 0)
    {
        printf("mysql_query() err:%d\n", ret);
        return ret;
    }
    ret = mysql_query(mysql, sql04);
    if (ret != 0)
    {
        printf("mysql_query() err:%d\n", ret);
        return ret;
    }
    ret = mysql_Rollback(mysql);
    if (ret != 0)
    {
        printf("mysql_Rollback() err:%d\n", ret);
        return ret;
    }
    mysql_close(mysql);
}

The above is the content of the transaction concept for getting started with MySQL. For more related content, please pay attention to the PHP Chinese website (www.php.cn)!


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn