淺談資料庫--事務(mysql)

來源:互聯網
上載者:User

標籤:mysql   資料庫   事務   c實現事務   

事務


  事務其實是一組對資料庫增刪改操作的組合,可以這樣來理解,當你往某個人身上打1000元的時候,在資料庫中會發生兩個改變,一個是你的錢減少了,另一個是那個人的錢增加了,這兩個操作必須同時滿足,不然問題就大了,怎樣保證兩個操作全部執行,這就需要mysql事務的支援。


mysql是支援事務的,但首先確認你是InnoDB儲存引擎

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/82/FC/wKiom1dnyT_j-W02AACX2WhXRAY777.png" title="無標題.png" width="800" height="144" border="0" hspace="0" vspace="0" style="width:800px;height:144px;" alt="wKiom1dnyT_j-W02AACX2WhXRAY777.png" />


mysql事務是為了維護資料庫的完整性,堆成批量的語句要麼全部執行,要麼全部不執行。一般用來管理insert delete 和update語句的。


事務的特點:

1、事務的原子性:一組事務,要麼成功;要麼撤回。

2、穩定性 : 有非法資料(外鍵約束之類),事務撤回。

3、隔離性:事務獨立運行。一個交易處理後的結果,影響了其他事務,那麼其他事務會撤回。事務的100%隔離,需要犧牲速度。

4、可靠性:軟、硬體崩潰後,InnoDB資料表驅動會利用記錄檔重構修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項 決定什麼時候吧事務儲存到日誌裡。


下面是在mysql中操作的一些命令;

set autoaction=0;//這條命令用來取消mysql的自動認可。begin;//事務開始。savepoint pointname;//設立儲存點,設立多個可以使用rollback返回到某一個上。rollback pointname;//返回到某個point。rollback;//不使用point則返回到begin。commit;//如果可以提交則用commit提交。

使用 show variables like ‘autocommit‘;可以查看當前autoaction的狀態


下面是我在mysql下執行的測試:

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/82/FD/wKioL1dn_dejDdw2AAC9cXdAiHU470.png" title="無標題.png" width="600" height="361" border="0" hspace="0" vspace="0" style="width:600px;height:361px;" alt="wKioL1dn_dejDdw2AAC9cXdAiHU470.png" />

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/82/FE/wKiom1dn_iOS3gguAACTSXRQPIM690.png" title="無標題.png" width="600" height="337" border="0" hspace="0" vspace="0" style="width:600px;height:337px;" alt="wKiom1dn_iOS3gguAACTSXRQPIM690.png" />

可以看出使用rollback後退回到了添加之前的資料。


使用savepoint的方式,讀者可以下去測試。



下面是C語言下對事務的測試:(使用connect c包)


首先測試前表中的資料時這樣的

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/82/FD/wKioL1dn_wyDe4hQAAA3BOerXwA166.png" title="無標題.png" alt="wKioL1dn_wyDe4hQAAA3BOerXwA166.png" />


我的測試代碼如下:


這裡的my_sql.h只給出了關於事務這部分的代碼(關於資料庫的所有操作的代碼會在後面的手動搭建http伺服器的部落格中給出)。
my_sql.h    13     } 14     bool HttpSql::mysql_start() 15     { 16         if(mysql_query(mysql,"SET autocommit=0")==0) 17         { 18             cout<<"start success"<<endl; 19             return true; 20         } 21         else { 22             return false; 23         } 24  25     } 26     bool HttpSql::mysql_begin() 27     { 28         if(mysql_query(mysql,"BEGIN")==0) 29         { 30             cout<<"begin success"<<endl; 31             return true; 32         } 33         else{ 34             return false; 35         } 36     } 37     bool HttpSql::mysql_commit() 38     { 39         if(mysql_query(mysql,"COMMIT")==0) 40         { 41             cout<<"commit success"<<endl; 42             return true; 43         } 44         else{ 40         { 41             cout<<"commit success"<<endl; 42             return true; 43         } 44         else{ 45             return false; 46         } 47     } 48     bool HttpSql::mysql_rollback() 49     { 50         if(mysql_query(mysql,"ROLLBACK")==0) 51         { 52             cout<<"rollback success"<<endl; 53             return true; 54         } 55         else 56         { 57             return false; 58         } 59     }121     bool HttpSql::mysql_modify(string str)122     {123         bool ret=false;124         string _str="update test_info set ";125     //  cout<<str<<endl;126         _str+=str.c_str();127     //  cout<<_str<<endl;128         ret=mysql_op(_str);129         if(ret)130         {131             return 1;132         }else{133             return -1;134         }  135      }                                                                                                                              46,3-9        28%                                                                                                                                           32,2-8         8%


modify.cpp#include"my_sql.h"104 int main()105 {106     HttpSql sql;107     if(!sql.mysql_start())108     {109         return -1;110     }111     char buf1[1024];112     char buf2[1024];113     memset(buf1,‘\0‘,sizeof(buf1));114     memset(buf2,‘\0‘,sizeof(buf2));115     strcpy(buf1,"update test_info set name=\"wangmazi\" where name=\"zhangsan\"");116     strcpy(buf2,"update test_info set name=\"wangmazi\" where name\"lisi\"");            //上面這行代碼我故意在where name後面少了一個等號117     string str1(buf1);118     string str2(buf2);119     if(!sql.mysql_begin())120     {121         return -1;122     }123     int ret1=sql.mysql_op(str1);124     int ret2=sql.mysql_op(str2);//因為str2一定會執行失敗索引返回false.125     //ret1=false;126     if(ret1&&ret2)127     {128         if(sql.mysql_commit())129         {130             cout<<"modify success"<<endl;131         }132         else{133             cout<<"modify failure"<<endl;134         }135     }else    //執行else語句使其退回修改之前的樣子。136     {137         if(sql.mysql_rollback())138         {139             cout<<"modify failure roolback success"<<endl;140         }141         else{142             cout<<"boom!!!1"<<endl;143         }144     }145 146 147 }                                                                                                                                                                                                                                                                                       131,2-8      底端                                                                                                                                           116,2-5       89%

測試結果

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/82/FD/wKioL1dn_wyDe4hQAAA3BOerXwA166.png" title="無標題.png" alt="wKioL1dn_wyDe4hQAAA3BOerXwA166.png" />

顯然表中沒有發生改變。


更改代碼將上面的‘=‘加上結果如下

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/82/FD/wKioL1doBEzDtUaaAAAvmL2tgZk514.png" title="無標題.png" alt="wKioL1doBEzDtUaaAAAvmL2tgZk514.png" />


在使用各種語言對事務進行操作的時候要在最後手動關閉串連 mysql_close();




你以為上面的就正確了嗎?確實是正確的,因為上面的都是已經配置好的。


在沒有弄好之前,花了測試了好久,才發現一個大坑!!聽我慢慢道來:


查閱了相關資料,基本上都是在用show engines;查看是否支援innodb儲存引擎,但是測試之後卻發現根本rollback不了,在代碼中顯示的是success,但資料庫中卻是1 worning; 雖然show engines顯示的 innodb是yes,但你仍需要添加這段代碼:

alter table test_info type=INNODB;不然你有可能永遠都測試成功不了



總結:事務對資料庫的完整性具有很深的意義。是不可或缺的一部分。關於事務的使用還有很多方面。需要慢慢學習


本文出自 “痕迹” 部落格,請務必保留此出處http://wpfbcr.blog.51cto.com/10696766/1791197

淺談資料庫--事務(mysql)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.