真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

淺談數(shù)據(jù)庫(kù)--事務(wù)(mysql)

事務(wù)

創(chuàng)新互聯(lián)是專業(yè)的貴港網(wǎng)站建設(shè)公司,貴港接單;提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行貴港網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

  事務(wù)其實(shí)是一組對(duì)數(shù)據(jù)庫(kù)增刪改操作的組合,可以這樣來(lái)理解,當(dāng)你往某個(gè)人身上打1000元的時(shí)候,在數(shù)據(jù)庫(kù)中會(huì)發(fā)生兩個(gè)改變,一個(gè)是你的錢減少了,另一個(gè)是那個(gè)人的錢增加了,這兩個(gè)操作必須同時(shí)滿足,不然問(wèn)題就大了,怎樣保證兩個(gè)操作全部執(zhí)行,這就需要MySQL事務(wù)的支持。


mysql是支持事務(wù)的,但首先確認(rèn)你是InnoDB存儲(chǔ)引擎

淺談數(shù)據(jù)庫(kù)--事務(wù)(mysql)

mysql事務(wù)是為了維護(hù)數(shù)據(jù)庫(kù)的完整性,堆成批量的語(yǔ)句要么全部執(zhí)行,要么全部不執(zhí)行。一般用來(lái)管理insert delete 和update語(yǔ)句的。

事務(wù)的特點(diǎn):

1、事務(wù)的原子性:一組事務(wù),要么成功;要么撤回。

2、穩(wěn)定性 : 有非法數(shù)據(jù)(外鍵約束之類),事務(wù)撤回。

3、隔離性:事務(wù)獨(dú)立運(yùn)行。一個(gè)事務(wù)處理后的結(jié)果,影響了其他事務(wù),那么其他事務(wù)會(huì)撤回。事務(wù)的100%隔離,需要犧牲速度。

4、可靠性:軟、硬件崩潰后,InnoDB數(shù)據(jù)表驅(qū)動(dòng)會(huì)利用日志文件重構(gòu)修改??煽啃院透咚俣炔豢杉娴?, innodb_flush_log_at_trx_commit選項(xiàng) 決定什么時(shí)候吧事務(wù)保存到日志里。

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

set autoaction=0;//這條命令用來(lái)取消mysql的自動(dòng)提交。
begin;//事務(wù)開(kāi)始。
savepoint pointname;//設(shè)立存儲(chǔ)點(diǎn),設(shè)立多個(gè)可以使用rollback返回到某一個(gè)上。
rollback pointname;//返回到某個(gè)point。
rollback;//不使用point則返回到begin。
commit;//如果可以提交則用commit提交。

使用 show variables like 'autocommit';可以查看當(dāng)前autoaction的狀態(tài)

下面是我在mysql下執(zhí)行的測(cè)試:

淺談數(shù)據(jù)庫(kù)--事務(wù)(mysql)

淺談數(shù)據(jù)庫(kù)--事務(wù)(mysql)

可以看出使用rollback后退回到了添加之前的數(shù)據(jù)。

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

下面是C語(yǔ)言下對(duì)事務(wù)的測(cè)試:(使用connect c包)

首先測(cè)試前表中的數(shù)據(jù)時(shí)這樣的

淺談數(shù)據(jù)庫(kù)--事務(wù)(mysql)

我的測(cè)試代碼如下:

這里的my_sql.h只給出了關(guān)于事務(wù)這部分的代碼(關(guān)于數(shù)據(jù)庫(kù)的所有操作的代碼會(huì)在后面的手動(dòng)搭建
http服務(wù)器的博客中給出)。
my_sql.h   
 13     }
 14     bool HttpSql::mysql_start()
 15     {
 16         if(mysql_query(mysql,"SET autocommit=0")==0)
 17         {
 18             cout<<"start success"<

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后面少了一個(gè)等于號(hào)
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);//因?yàn)閟tr2一定會(huì)執(zhí)行失敗索引返回false.
125     //ret1=false;
126     if(ret1&&ret2)
127     {
128         if(sql.mysql_commit())
129         {
130             cout<<"modify success"<

測(cè)試結(jié)果

淺談數(shù)據(jù)庫(kù)--事務(wù)(mysql)

顯然表中沒(méi)有發(fā)生改變。


更改代碼將上面的'='加上結(jié)果如下

淺談數(shù)據(jù)庫(kù)--事務(wù)(mysql)

在使用各種語(yǔ)言對(duì)事務(wù)進(jìn)行操作的時(shí)候要在最后手動(dòng)關(guān)閉連接 mysql_close();

你以為上面的就正確了嗎?確實(shí)是正確的,因?yàn)樯厦娴亩际且呀?jīng)配置好的。


在沒(méi)有弄好之前,花了測(cè)試了好久,才發(fā)現(xiàn)一個(gè)大坑??!聽(tīng)我慢慢道來(lái):

查閱了相關(guān)資料,基本上都是在用show engines;查看是否支持innodb存儲(chǔ)引擎,但是測(cè)試之后卻發(fā)現(xiàn)根本rollback不了,在代碼中顯示的是success,但數(shù)據(jù)庫(kù)中卻是1 worning; 雖然show engines顯示的 innodb是yes,但你仍需要添加這段代碼:

alter table test_info type=INNODB;不然你有可能永遠(yuǎn)都測(cè)試成功不了

總結(jié):事務(wù)對(duì)數(shù)據(jù)庫(kù)的完整性具有很深的意義。是不可或缺的一部分。關(guān)于事務(wù)的使用還有很多方面。需要慢慢學(xué)習(xí)


網(wǎng)站名稱:淺談數(shù)據(jù)庫(kù)--事務(wù)(mysql)
網(wǎng)站URL:http://weahome.cn/article/pcgjso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部