mysql怎么實(shí)現(xiàn)事物的,mysql在企業(yè)中的簡(jiǎn)單應(yīng)用舉例

PHP 中mysql如何實(shí)現(xiàn)事務(wù)提交

事務(wù)就是指對(duì)數(shù)據(jù)庫(kù)的多次修改,要么全部成功,要么全部失敗,不能出現(xiàn)部分修改成功,部分修改失敗的情況。

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比聞喜網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式聞喜網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋聞喜地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。

PHP下操作mysql數(shù)據(jù)庫(kù)要實(shí)現(xiàn)事務(wù)提交,需注意以下方面:

1, 數(shù)據(jù)庫(kù)表存儲(chǔ)引擎類型設(shè)置為innoDB。默認(rèn)的mysql表采用MYISAM引擎,是不支持事務(wù)的,因此要采用以下語(yǔ)句變更:

mysql alter table ‘table_name’ engine=innodb;

2,PDO對(duì)象設(shè)置要設(shè)置errmode為Exception,否則第16行SQL執(zhí)行出錯(cuò),語(yǔ)句也不會(huì)跳到catch段去rollback, 而是繼續(xù)向下執(zhí)行直到commit。

一文詳解-MySQL 事務(wù)和鎖

當(dāng)多個(gè)用戶訪問(wèn)同一份數(shù)據(jù)時(shí),一個(gè)用戶在更改數(shù)據(jù)的過(guò)程中,可能有其他用戶同時(shí)發(fā)起更改請(qǐng)求,為保證數(shù)據(jù)庫(kù)記錄的更新從一個(gè)一致性狀態(tài)變?yōu)榱硗庖粋€(gè)一致性狀態(tài),使用事務(wù)處理是非常必要的,事務(wù)具有以下四個(gè)特性:

MySQL 提供了多種事務(wù)型存儲(chǔ)引擎,如 InnoDB 和 BDB 等,而 MyISAM 不支持事務(wù)。為了支持事務(wù),InnoDB 存儲(chǔ)引擎引入了與事務(wù)處理相關(guān)的 REDO 日志和 UNDO 日志,同時(shí)事務(wù)依賴于 MySQL 提供的鎖機(jī)制

事務(wù)執(zhí)行時(shí)需要將執(zhí)行的事務(wù)日志寫入日志文件,對(duì)應(yīng)的文件為 REDO 日志。當(dāng)每條 SQL 進(jìn)行數(shù)據(jù)更新操作時(shí),首先將 REDO 日志寫進(jìn)日志緩沖區(qū)。當(dāng)客戶端執(zhí)行 COMMIT 命令提交時(shí),日志緩沖區(qū)的內(nèi)容將被刷新到磁盤,日志緩沖區(qū)的刷新方式或者時(shí)間間隔可以通過(guò)參數(shù) innodb_flush_log_at_trx_commit 控制

REDO 日志對(duì)應(yīng)磁盤上的 ib_logifleN 文件,該文件默認(rèn)為 5MB,建議設(shè)置為 512MB,以便容納較大的事務(wù)。MySQL 崩潰恢復(fù)時(shí)會(huì)重新執(zhí)行 REDO 日志的記錄,恢復(fù)最新數(shù)據(jù),保證已提交事務(wù)的持久性

與 REDO 日志相反,UNDO 日志主要用于事務(wù)異常時(shí)的數(shù)據(jù)回滾,具體內(nèi)容就是記錄數(shù)據(jù)被修改前的信息到 UNDO 緩沖區(qū),然后在合適的時(shí)間將內(nèi)容刷新到磁盤

假如由于系統(tǒng)錯(cuò)誤或者 rollback 操作而導(dǎo)致事務(wù)回滾,可以根據(jù) undo 日志回滾到?jīng)]修改前的狀態(tài),保證未提交事務(wù)的原子性

與 REDO 日志不同的是,磁盤上不存在單獨(dú)的 UNDO 日志文件,所有的 UNDO 日志均存在表空間對(duì)應(yīng)的 .ibd 數(shù)據(jù)文件中,即使 MySQL 服務(wù)啟動(dòng)了獨(dú)立表空間

在 MySQL 中,可以使用 BEGIN 開始事務(wù),使用 COMMIT 結(jié)束事務(wù),中間可以使用 ROLLBACK 回滾事務(wù)。MySQL 通過(guò) SET AUTOCOMMIT、START TRANSACTION、COMMIT 和 ROLLBACK 等語(yǔ)句支持本地事務(wù)

MySQL 定義了四種隔離級(jí)別,指定事務(wù)中哪些數(shù)據(jù)改變其他事務(wù)可見、哪些數(shù)據(jù)該表其他事務(wù)不可見。低級(jí)別的隔離級(jí)別可以支持更高的并發(fā)處理,同時(shí)占用的系統(tǒng)資源更少

InnoDB 系統(tǒng)級(jí)事務(wù)隔離級(jí)別可以使用以下語(yǔ)句設(shè)置:

查看系統(tǒng)級(jí)事務(wù)隔離級(jí)別:

InnoDB 會(huì)話級(jí)事務(wù)隔離級(jí)別可以使用以下語(yǔ)句設(shè)置:

查看會(huì)話級(jí)事務(wù)隔離級(jí)別:

在該隔離級(jí)別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。讀取未提交的數(shù)據(jù)稱為臟讀(Dirty Read),即是:首先開啟 A 和 B 兩個(gè)事務(wù),在 B 事務(wù)更新但未提交之前,A 事務(wù)讀取到了更新后的數(shù)據(jù),但由于 B 事務(wù)回滾,導(dǎo)致 A 事務(wù)出現(xiàn)了臟讀現(xiàn)象

所有事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變,此級(jí)別可以解決臟讀,但也會(huì)導(dǎo)致不可重復(fù)讀(Nonrepeatable Read):首先開啟 A 和 B 兩個(gè)事務(wù),A事務(wù)讀取了 B 事務(wù)的數(shù)據(jù),在 B 事務(wù)更新并提交后,A 事務(wù)又讀取到了更新后的數(shù)據(jù),此時(shí)就出現(xiàn)了同一 A 事務(wù)中的查詢出現(xiàn)了不同的查詢結(jié)果

MySQL 默認(rèn)的事務(wù)隔離級(jí)別,能確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí)看到同樣的數(shù)據(jù)行,理論上會(huì)導(dǎo)致一個(gè)問(wèn)題,幻讀(Phontom Read)。例如,第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)做了修改,這種修改會(huì)涉及表中的全部數(shù)據(jù)行,同時(shí)第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這次的修改是向表中插入一行新數(shù)據(jù),此時(shí)就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒(méi)有修改的數(shù)據(jù)行

InnoDB 通過(guò)多版本并發(fā)控制機(jī)制(MVCC)解決了該問(wèn)題:InnoDB 通過(guò)為每個(gè)數(shù)據(jù)行增加兩個(gè)隱含值的方式來(lái)實(shí)現(xiàn),這兩個(gè)隱含值記錄了行的創(chuàng)建時(shí)間、過(guò)期時(shí)間以及每一行存儲(chǔ)時(shí)間發(fā)生時(shí)的系統(tǒng)版本號(hào),每個(gè)查詢根據(jù)事務(wù)的版本號(hào)來(lái)查詢結(jié)果

通過(guò)強(qiáng)制事務(wù)排序,使其不可能相互沖突,從而解決幻讀問(wèn)題。簡(jiǎn)而言之,就是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖實(shí)現(xiàn),這個(gè)級(jí)別會(huì)導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng),一般不推薦使用

為了解決數(shù)據(jù)庫(kù)并發(fā)控制問(wèn)題,如走到同一時(shí)刻客戶端對(duì)同一張表做更新或者查詢操作,需要對(duì)并發(fā)操作進(jìn)行控制,因此產(chǎn)生了鎖

共享鎖的粒度是行或者元組(多個(gè)行),一個(gè)事務(wù)獲取了共享鎖以后,可以對(duì)鎖定范圍內(nèi)的數(shù)據(jù)執(zhí)行讀操作

排他鎖的粒度與共享鎖相同,一個(gè)事務(wù)獲取排他鎖以后,可以對(duì)鎖定范圍內(nèi)的數(shù)據(jù)執(zhí)行寫操作

有兩個(gè)事務(wù) A 和 B,如果事務(wù) A 獲取了一個(gè)元組的共享鎖,事務(wù) B 還可以立即獲取這個(gè)元組的共享鎖,但不能獲取這個(gè)元組的排他鎖,必須等到事務(wù) A 釋放共享鎖之后。如果事務(wù) A 獲取了一個(gè)元組的排他鎖,事務(wù) B 不能立即獲取這個(gè)元組的共享鎖,也不能立即獲取這個(gè)元組的排他鎖,必須等到 A 釋放排他鎖之后

意向鎖是一種表鎖,鎖定的粒度是整張表,分為意向共享鎖和意向排他鎖。意向共享鎖表示一個(gè)事務(wù)有意對(duì)數(shù)據(jù)上共享鎖或者排他鎖。有意表示事務(wù)想執(zhí)行操作但還沒(méi)真正執(zhí)行

鎖的粒度主要分為表鎖和行鎖

表鎖的開銷最小,同時(shí)允許的并發(fā)量也是最小。MyISAM 存儲(chǔ)引擎使用該鎖機(jī)制。當(dāng)要寫入數(shù)據(jù)時(shí),整個(gè)表記錄被鎖,此時(shí)其他讀/寫動(dòng)作一律等待。一些特定的動(dòng)作,如 ALTER TABLE 執(zhí)行時(shí)使用的也是表鎖

行鎖可以支持最大的并發(fā),InnoDB 存儲(chǔ)引擎使用該鎖機(jī)制。如果要支持并發(fā)讀/寫,建議采用 InnoDB 存儲(chǔ)引擎

什么是mysql的事務(wù)和實(shí)現(xiàn)

msql的一個(gè)事務(wù)的回歸測(cè)試,可以自測(cè)一下,了解下事務(wù)。

舉個(gè)例子:小明和小飛兩個(gè)人現(xiàn)在手里各有¥100,突然小飛腦袋出問(wèn)題了說(shuō)給小明¥50,現(xiàn)在他們手里的錢就是(小明:¥150,小飛:¥50);這樣同步就是一個(gè)事務(wù)的完成,下面是demo

/*

事務(wù) ACID

原子性 Atomic

一致性 Consistency

隔離性 Isolation

持久性 Durability

*/

var?mysql?=?require('mysql');

var?connection?=?mysql.createConnection({

host:'localhost',

user:'root',

password:'',

database:'yudi'

});

connection.connect();

//開始一個(gè)事務(wù)

connection.beginTransaction(function(err){

if(err)?throw?err;

connection.query('update?account1?set?mny=0?where?id=1',function(err,results){

if(err){

connection.rollback(function(){

throw?err;

})

throw?err;

}

connection.query('update?account2?set?mny=200?where?id=1',function(err,results){

if(err){

//回滾一個(gè)事物

connection.rollback(function(){

throw?err;

})

throw?err;

}

//提交一個(gè)事物

connection.commit(function(err){

if(err){

connection.rollback(function(){

throw?err;

})

throw?err;

}

console.log('success');

});

});

});

})

Mysql數(shù)據(jù)庫(kù)中,事務(wù)是指什么?如何使用該功能?

什么是事務(wù)? \x0d\x0a\x0d\x0a事務(wù)是邏輯上的一組操作,組成這組操作的各個(gè)單元,要不全都成功要不全都失敗,這個(gè)特性就是事務(wù) \x0d\x0a\x0d\x0a注意:mysql數(shù)據(jù)支持事務(wù),但是要求必須是innoDB存儲(chǔ)引擎 \x0d\x0a\x0d\x0a解決這個(gè)問(wèn)題: \x0d\x0a\x0d\x0amysql的事務(wù)解決這個(gè)問(wèn)題,因?yàn)閙ysql的事務(wù)特性,要求這組操作,要不全都成功,要不全都失敗,這樣就避免了某個(gè)操作成功某個(gè)操作失敗。利于數(shù)據(jù)的安全 \x0d\x0a\x0d\x0a如何使用: \x0d\x0a\x0d\x0a(1)在執(zhí)行sql語(yǔ)句之前,我們要開啟事務(wù) start transaction; \x0d\x0a\x0d\x0a(2)正常執(zhí)行我們的sql語(yǔ)句 \x0d\x0a\x0d\x0a(3)當(dāng)sql語(yǔ)句執(zhí)行完畢,存在兩種情況: \x0d\x0a\x0d\x0a1,全都成功,我們要將sql語(yǔ)句對(duì)數(shù)據(jù)庫(kù)造成的影響提交到數(shù)據(jù)庫(kù)中,committ \x0d\x0a\x0d\x0a2,某些sql語(yǔ)句失敗,我們執(zhí)行rollback(回滾),將對(duì)數(shù)據(jù)庫(kù)操作趕緊撤銷 \x0d\x0a\x0d\x0a(注意:mysql數(shù)據(jù)支持事務(wù),但是要求必須是innoDB存儲(chǔ)引擎) \x0d\x0amysql create table bank(name varchar(20),money decimal(5,1))engine=innodb defau \x0d\x0alt charset=utf8; \x0d\x0a\x0d\x0amysql inset into bank values('shaotuo',1000),('laohu',5000); \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a\x0d\x0a------沒(méi)有成功“回滾”執(zhí)行rollback \x0d\x0amysql start transaction; //開啟事務(wù) \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set moey=money-500 where name='laohu'; \x0d\x0aERROR 1054 (42S22): Unknown column 'moey' in 'field list' \x0d\x0amysql rollback; //只要有一個(gè)不成功,執(zhí)行rollback操作 \x0d\x0aQuery OK, 0 rows affected (0.01 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a------成功之后 進(jìn)行commit操作 \x0d\x0amysql start transaction; //開啟事務(wù) \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.01 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set money=money-500 where name='laohu'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql commit; //兩個(gè)都成功后執(zhí)行commit(只要不執(zhí)行commit,sql語(yǔ)句不會(huì)對(duì)真實(shí)的數(shù)據(jù)庫(kù)造成影響) \x0d\x0aQuery OK, 0 rows affected (0.05 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1500.0 | \x0d\x0a| laohu | 4500.0 | \x0d\x0a+---------+--------+

mysql怎么實(shí)現(xiàn)事務(wù)級(jí)別的臨時(shí)表

MySQL 需要?jiǎng)?chuàng)建隱式臨時(shí)表來(lái)解決某些類型的查詢。往往查詢的排序階段需要依賴臨時(shí)表。例如,當(dāng)您使用 GROUP BY,ORDER BY 或DISTINCT 時(shí)。這樣的查詢分兩個(gè)階段執(zhí)行:首先是收集數(shù)據(jù)并將它們放入臨時(shí)表中,然后是在臨時(shí)表上執(zhí)行排序。

對(duì)于某些 UNION 語(yǔ)句,不能合并的 VIEW,子查詢時(shí)用到派生表,多表 UPDATE 以及其他一些情況,還需要使用臨時(shí)表。如果臨時(shí)表很小,可以到內(nèi)存中創(chuàng)建,否則它將在磁盤上創(chuàng)建。MySQL 在內(nèi)存中創(chuàng)建了一個(gè)表,如果它變得太大,就會(huì)被轉(zhuǎn)換為磁盤上存儲(chǔ)。內(nèi)存臨時(shí)表的最大值由 tmp_table_size 或 max_heap_table_size 值定義,以較小者為準(zhǔn)。MySQL 5.7 中的默認(rèn)大小為 16MB。如果運(yùn)行查詢的數(shù)據(jù)量較大,或者尚未查詢優(yōu)化,則可以增加該值。設(shè)置閾值時(shí),請(qǐng)考慮可用的 RAM 大小以及峰值期間的并發(fā)連接數(shù)。你無(wú)法無(wú)限期地增加變量,因?yàn)樵谀承r(shí)候你需要讓 MySQL 使用磁盤上的臨時(shí)表。

注意:如果涉及的表具有 TEXT 或 BLOB 列,則即使大小小于配置的閾值,也會(huì)在磁盤上創(chuàng)建臨時(shí)表。

本文名稱:mysql怎么實(shí)現(xiàn)事物的,mysql在企業(yè)中的簡(jiǎn)單應(yīng)用舉例
本文鏈接:http://m.kartarina.com/article30/dseispo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)云服務(wù)器網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計(jì)網(wǎng)站收錄外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)
主站蜘蛛池模板: 无码无套少妇毛多18p| 中文一国产一无码一日韩| 2019亚洲午夜无码天堂| 亚洲日韩精品无码专区加勒比| 粉嫩大学生无套内射无码卡视频| 精品人妻系列无码一区二区三区 | 国产成人无码精品一区二区三区| 无码AV片在线观看免费| heyzo高无码国产精品| 亚洲精品无码久久| 午夜人性色福利无码视频在线观看| 国产成人无码网站| 无码任你躁久久久久久| 少妇无码一区二区三区| 中出人妻中文字幕无码| 亚洲精品一级无码中文字幕| 亚洲熟妇av午夜无码不卡| 无码一区二区三区免费| 成在人线av无码免费高潮喷水 | 日韩精品无码一区二区视频| 亚洲国产成人无码AV在线| 亚洲av无码一区二区三区不卡 | 免费无码又黄又爽又刺激| 日韩精品久久无码人妻中文字幕| 精品无码国产自产拍在线观看蜜| 无码中文在线二区免费| 无码人妻精品中文字幕免费东京热 | a级毛片无码免费真人| 免费看又黄又无码的网站| 亚洲AV综合色区无码另类小说| 亚洲人成无码久久电影网站| 日韩加勒比一本无码精品| 亚洲av中文无码乱人伦在线观看| 亚洲中文字幕在线无码一区二区 | 无码毛片一区二区三区中文字幕 | 无码不卡av东京热毛片| 色窝窝无码一区二区三区| 午夜福利无码不卡在线观看| 无码乱人伦一区二区亚洲一| 无码成A毛片免费| 无码av人妻一区二区三区四区 |