自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL數(shù)據(jù)庫(kù)和相關(guān)事務(wù)總結(jié)

數(shù)據(jù)庫(kù) MySQL
此文章主要是對(duì)MySQL數(shù)據(jù)庫(kù)和相關(guān)事務(wù)的介紹,其中也包括對(duì)哪些實(shí)際相關(guān)問題會(huì)用到事務(wù)處理的描述,以下就是文章的主要內(nèi)容描述。

以下的文章主要向大家描述的是MySQL數(shù)據(jù)庫(kù)和相關(guān)事務(wù),在實(shí)際操作中有很多人都認(rèn)為MySQL數(shù)據(jù)庫(kù)對(duì)事務(wù)處理是不支持的,其實(shí),只要MySQL數(shù)據(jù)庫(kù)版本支持BDB或是InnoDB表類型,那么你的MySQL就具有事務(wù)處理的能力。

這里面,又以InnoDB表類型用的最多,雖然后來發(fā)生了諸如Oracle收購(gòu)InnoDB等令MySQL不爽的事情,但那些商業(yè)上的斗爭(zhēng)與技術(shù)無關(guān),下面以InnoDB表類型為例簡(jiǎn)單說一下MySQL中的事務(wù)。

先來明確一下事務(wù)涉及的相關(guān)知識(shí):

事務(wù)都應(yīng)該具備ACID特征。所謂ACID是Atomic(原子性),Consistent(一致性),Isolated(隔離性),Durable(持續(xù)性)四個(gè)詞的首字母所寫,下面以“銀行轉(zhuǎn)帳”為例來分別說明一下它們的含義:

原子性:組成事務(wù)處理的語(yǔ)句形成了一個(gè)邏輯單元,不能只執(zhí)行其中的一部分。換句話說,事務(wù)是不可分割的最小單元。比如:銀行轉(zhuǎn)帳過程中,必須同時(shí)從一個(gè)帳戶減去轉(zhuǎn)帳金額,并加到另一個(gè)帳戶中,只改變一個(gè)帳戶是不合理的。

一致性:在事務(wù)處理執(zhí)行前后,MySQL數(shù)據(jù)庫(kù)是一致的。也就是說,事務(wù)應(yīng)該正確的轉(zhuǎn)換系統(tǒng)狀態(tài)。比如:銀行轉(zhuǎn)帳過程中,要么轉(zhuǎn)帳金額從一個(gè)帳戶轉(zhuǎn)入另一個(gè)帳戶,要么兩個(gè)帳戶都不變,沒有其他的情況。

隔離性:一個(gè)事務(wù)處理對(duì)另一個(gè)事務(wù)處理沒有影響。就是說任何事務(wù)都不可能看到一個(gè)處在不完整狀態(tài)下的事務(wù)。比如說,銀行轉(zhuǎn)帳過程中,在轉(zhuǎn)帳事務(wù)沒有提交之前,另一個(gè)轉(zhuǎn)帳事務(wù)只能處于等待狀態(tài)。

持續(xù)性:事務(wù)處理的效果能夠被***保存下來。反過來說,事務(wù)應(yīng)當(dāng)能夠承受所有的失敗,包括服務(wù)器、進(jìn)程、通信以及媒體失敗等等。比如:銀行轉(zhuǎn)帳過程中,轉(zhuǎn)帳后帳戶的狀態(tài)要能被保存下來。

再來看看哪些問題會(huì)用到事務(wù)處理:

 

這里不說“銀行轉(zhuǎn)帳”的例子了,說一個(gè)大家實(shí)際更容易遇到的“網(wǎng)上購(gòu)書”的例子。先假設(shè)一下問題的背景:網(wǎng)上購(gòu)書,某書(MySQL數(shù)據(jù)庫(kù)編號(hào)為123)只剩***一本,而這個(gè)時(shí)候,兩個(gè)用戶對(duì)這本書幾乎同時(shí)發(fā)出了購(gòu)買請(qǐng)求,讓我們看看整個(gè)過程:

在具體分析之前,先來看看數(shù)據(jù)表的定義:

 

  1. create table book  
  2. (  
  3. book_id unsigned int(10) not null auto_increment,  
  4. book_name varchar(100) not null,  
  5. book_price float(5, 2) not null, #我假設(shè)每本書的價(jià)格不會(huì)超過999.99元  
  6. book_number int(10) not null,  
  7. primary key (book_id)  
  8. )  
  9. type = innodb; #engine = innodb也行 

對(duì)于用戶甲來說,他的動(dòng)作稍微比乙快一點(diǎn)點(diǎn),其購(gòu)買過程所觸發(fā)的動(dòng)作大致是這樣的:

1. SELECT book_number FROM book WHERE book_id = 123;

book_number大于零,確認(rèn)購(gòu)買行為并更新book_number

2. UPDATE book SET book_number = book_number - 1 WHERE book_id = 123;

購(gòu)書成功

而對(duì)于用戶乙來說,他的動(dòng)作稍微比甲慢一點(diǎn)點(diǎn),其購(gòu)買過程所觸發(fā)的動(dòng)作和甲相同:

1. SELECT book_number FROM book WHERE book_id = 123;

這個(gè)時(shí)候,甲剛剛進(jìn)行完***步的操作,還沒來得及做第二步操作,所以book_number一定大于零

2. UPDATE book SET book_number = book_number - 1 WHERE book_id = 123;

購(gòu)書成功

表面上看甲乙的操作都成功了,他們都買到了書,但是庫(kù)存只有一本,他們?cè)趺纯赡芏汲晒δ??再看看?shù)據(jù)表里book_number的內(nèi)容,已經(jīng)變成“-1”了,這當(dāng)然是不能允許的(實(shí)際上,聲明這樣的列類型應(yīng)該加上unsigned的屬性,以保證其不能為負(fù),這里是為了說明問題所以沒有這樣設(shè)置)

好了,問題陳述清楚了,再來看看怎么利用事務(wù)來解決這個(gè)問題,打開MySQL手冊(cè),可以看到想用事務(wù)來保護(hù)你的SQL正確執(zhí)行其實(shí)很簡(jiǎn)單,基本就是三個(gè)語(yǔ)句:開始,提交,回滾。

開始:START TRANSACTION或BEGIN語(yǔ)句可以開始一項(xiàng)新的事務(wù)

提交:COMMIT可以提交當(dāng)前事務(wù),是變更成為***變更

回滾:ROLLBACK可以回滾當(dāng)前事務(wù),取消其變更

此外,SET AUTOCOMMIT = {0 | 1}可以禁用或啟用默認(rèn)的autocommit模式,用于當(dāng)前連接。

那是不是只要用事務(wù)語(yǔ)句包一下我們的SQL語(yǔ)句就能保證正確了呢?比如下面代碼:

 

  1. BEGIN;  
  2. SELECT book_number FROM book WHERE book_id = 123;  
  3. // ...  
  4. UPDATE book SET book_numberbook_number = book_number - 1 WHERE book_id = 123;  
  5. COMMIT;  

 

答案是否定了,這樣依然不能避免問題的發(fā)生,如果想避免這樣的情況,實(shí)際應(yīng)該如下:

 

  1. BEGIN;  
  2. SELECT book_number FROM book WHERE book_id = 123 FOR UPDATE;  
  3. // ...  
  4. UPDATE book SET book_numberbook_number = book_number - 1 WHERE book_id = 123;  
  5. COMMIT;  

 

由于加入了FOR UPDATE,所以會(huì)在此條記錄上加上一個(gè)行鎖,如果此事務(wù)沒有完全結(jié)束,那么其他的事務(wù)在使用SELECT ... FOR UPDATE請(qǐng)求的時(shí)候就會(huì)處于等待狀態(tài),直到上一個(gè)事務(wù)結(jié)束,它才能繼續(xù),從而避免了問題的發(fā)生,需要注意的是,如果你其他的事務(wù)使用的是不帶FOR UPDATE的SELECT語(yǔ)句,將得不到這種保護(hù)。

以上的相關(guān)內(nèi)容就是對(duì)MySQL數(shù)據(jù)庫(kù)與事務(wù)的介紹,望你能有所收獲。

【編輯推薦】

  1. 實(shí)現(xiàn)MySQL 用戶密碼的設(shè)置步驟
  2. MySQL數(shù)據(jù)庫(kù)安全設(shè)置的操作流程
  3. 使用MySQL 數(shù)據(jù)庫(kù)出現(xiàn)的困難解決
  4. MySQL使用方法匯總描述
  5. MySQL mysqldump命令的正確應(yīng)用


 

責(zé)任編輯:佚名 來源: cnblogs
相關(guān)推薦

2011-08-05 14:02:17

MySQL數(shù)據(jù)庫(kù)異常處理

2014-11-05 10:37:44

Windows Pho數(shù)據(jù)庫(kù)

2010-04-15 08:57:29

Oracle數(shù)據(jù)庫(kù)

2019-01-02 11:10:40

MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)設(shè)計(jì)

2016-12-29 12:24:33

MySQL數(shù)據(jù)庫(kù)移植

2020-06-17 16:56:36

數(shù)據(jù)庫(kù)MySQL跨行事務(wù)

2017-08-22 17:10:45

數(shù)據(jù)庫(kù)MySQL事務(wù)模型

2019-07-11 08:45:00

MySQL數(shù)據(jù)庫(kù)緩存

2024-04-08 10:11:15

MYSQL數(shù)據(jù)庫(kù)事務(wù)

2010-05-14 14:38:03

安裝MySQL

2010-07-23 15:03:02

SQL Server數(shù)

2010-10-08 09:38:55

Android數(shù)據(jù)庫(kù)事

2009-09-24 14:12:22

Hibernate數(shù)據(jù)

2018-08-01 14:00:49

MySQL數(shù)據(jù)庫(kù)PHP

2024-11-27 11:39:02

2022-05-09 15:52:23

MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)表

2017-11-08 10:20:10

2010-11-15 10:30:04

Oracle數(shù)據(jù)庫(kù)啟動(dòng)

2009-05-08 09:56:37

MaxDBMySQL數(shù)據(jù)庫(kù)管理

2025-04-08 06:00:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)