mysql默認是自動提交的,也就是你提交一個query,它就直接執(zhí)行!我們可以通過?
set autocommit=0 禁止自動提交?
set autocommit=1開啟自動提交?
mysql中innodb引擎才支持事務處理,默認是自動提交的;?
另外一種常用的myisam引擎是不支持事務的,本身就沒有事務的概念 .
可類比Oracle事務的概念?。?!
能夠避免MySQL的自動提交,自己封裝API以后實現(xiàn)回滾等操作!??!
#include?<stdio.h> #include?<stdlib.h> #include?<string.h> #include?<dlfcn.h> #include?<mysql> #include?<stdio.h> #include?<stdlib.h> #include?<unistd.h> #include?<string.h> #include?<errno.h> #include?<termios.h> #include?<mysql> /* MySQL?set?autocommit?=?0或1分別什么啊,哪個是自動提交啊 要熟練使用mysql的幫助文檔,在里面查找autocommit,就會有相應的注釋,比我在這里直接給你說要深刻得多。 autocoomit是事務,根據(jù)mysql的文檔如果等于1是立即提交。但在transction中只有遇到commit或rollback才提交。希望對你有用。 */ /* MYSQL默認是自動提交的,也就是你提交一個QUERY,它就直接執(zhí)行!我們可以通過 ?????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; ????//--執(zhí)行事務開始SQL ????ret?=?mysql_query(mysql,?BEGIN_TRAN); ????if?(ret?!=?0) ????{ ????????printf("func?mysql_query()?err:?%dn",?ret); ????????return?ret; ????} ????//--設置事務手動提交 ????ret?=?mysql_query(mysql,?SET_TRAN); ????if?(ret?!=?0) ????{ ????????printf("func?mysql_query()?err:?%dn",?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:?%dn",?ret); ????????return?ret; ????} ????//--恢復事務自動提交標志 ????ret?=?mysql_query(mysql,?UNSET_TRAN); ????if?(ret?!=?0) ????{ ????????printf("func?mysql_query()?err:?%dn",?ret); ????????return?ret; ????} ????return?ret; } int?mysql_Commit(MYSQL?*mysql) { ????int?ret?=?0; ????//--執(zhí)行事務提交SQL ????ret?=?mysql_query(mysql,?COMMIT_TRAN); ????if?(ret?!=?0) ????{ ????????printf("func?mysql_query()?err:?%dn",?ret); ????????return?ret; ????} ????//--恢復自動提交設置 ????ret?=?mysql_query(mysql,?UNSET_TRAN); ????if?(ret?!=?0) ????{ ????????printf("func?mysql_query()?err:?%dn",?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,?'10',?'1')" #define?sql02?"INSERT?INTO?test_table(col1,col2,col3)?VALUES(20,?'20',?'2')" #define?sql03?"INSERT?INTO?test_table(col1,col2,col3)?VALUES(30,?'30',?'3')" #define?sql04?"INSERT?INTO?test_table(col1,col2,col3)?VALUES(40,?'40',?'4')" 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()?errn"); ????????return?ret; ????} ????else ????{ ????????printf("?ok......n"); ????} ????ret?=?mysql_BeginTran(mysql); ????if?(ret?!=?0) ????{ ????????printf("mysql_BeginTran()?err:%dn",?ret); ????????return?ret; ????} ????ret?=?mysql_query(mysql,?sql01); ????if?(ret?!=?0) ????{ ????????printf("mysql_query()?err:%dn",?ret); ????????return?ret; ????} ????ret?=?mysql_query(mysql,?sql02); ????if?(ret?!=?0) ????{ ????????printf("mysql_query()?err:%dn",?ret); ????????return?ret; ????} ????ret?=?mysql_Commit(mysql); ????if?(ret?!=?0) ????{ ????????printf("mysql_Commit()?err:%dn",?ret); ????????return?ret; ????} ????ret?=?mysql_BeginTran(mysql); ????if?(ret?!=?0) ????{ ????????printf("mysql_BeginTran()?err:%dn",?ret); ????????return?ret; ????} ????ret?=?mysql_query(mysql,?sql03); ????if?(ret?!=?0) ????{ ????????printf("mysql_query()?err:%dn",?ret); ????????return?ret; ????} ????ret?=?mysql_query(mysql,?sql04); ????if?(ret?!=?0) ????{ ????????printf("mysql_query()?err:%dn",?ret); ????????return?ret; ????} ????ret?=?mysql_Rollback(mysql); ????if?(ret?!=?0) ????{ ????????printf("mysql_Rollback()?err:%dn",?ret); ????????return?ret; ????} ????mysql_close(mysql); }</mysql></termios.h></errno.h></string.h></unistd.h></stdlib.h></stdio.h></mysql></dlfcn.h></string.h></stdlib.h></stdio.h>
以上就是MySQL入門之事務概念的內(nèi)容,更多相關內(nèi)容請關注PHP中文網(wǎng)(www.php.cn)!
? 版權聲明
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END