成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL數據庫和相關事務總結

數據庫 MySQL
此文章主要是對MySQL數據庫和相關事務的介紹,其中也包括對哪些實際相關問題會用到事務處理的描述,以下就是文章的主要內容描述。

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

這里面,又以InnoDB表類型用的最多,雖然后來發生了諸如Oracle收購InnoDB等令MySQL不爽的事情,但那些商業上的斗爭與技術無關,下面以InnoDB表類型為例簡單說一下MySQL中的事務。

先來明確一下事務涉及的相關知識:

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

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

一致性:在事務處理執行前后,MySQL數據庫是一致的。也就是說,事務應該正確的轉換系統狀態。比如:銀行轉帳過程中,要么轉帳金額從一個帳戶轉入另一個帳戶,要么兩個帳戶都不變,沒有其他的情況。

隔離性:一個事務處理對另一個事務處理沒有影響。就是說任何事務都不可能看到一個處在不完整狀態下的事務。比如說,銀行轉帳過程中,在轉帳事務沒有提交之前,另一個轉帳事務只能處于等待狀態。

持續性:事務處理的效果能夠被***保存下來。反過來說,事務應當能夠承受所有的失敗,包括服務器、進程、通信以及媒體失敗等等。比如:銀行轉帳過程中,轉帳后帳戶的狀態要能被保存下來。

再來看看哪些問題會用到事務處理:

 

這里不說“銀行轉帳”的例子了,說一個大家實際更容易遇到的“網上購書”的例子。先假設一下問題的背景:網上購書,某書(MySQL數據庫編號為123)只剩***一本,而這個時候,兩個用戶對這本書幾乎同時發出了購買請求,讓我們看看整個過程:

在具體分析之前,先來看看數據表的定義:

 

  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, #我假設每本書的價格不會超過999.99元  
  6. book_number int(10) not null,  
  7. primary key (book_id)  
  8. )  
  9. type = innodb; #engine = innodb也行 

對于用戶甲來說,他的動作稍微比乙快一點點,其購買過程所觸發的動作大致是這樣的:

1. SELECT book_number FROM book WHERE book_id = 123;

book_number大于零,確認購買行為并更新book_number

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

購書成功

而對于用戶乙來說,他的動作稍微比甲慢一點點,其購買過程所觸發的動作和甲相同:

1. SELECT book_number FROM book WHERE book_id = 123;

這個時候,甲剛剛進行完***步的操作,還沒來得及做第二步操作,所以book_number一定大于零

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

購書成功

表面上看甲乙的操作都成功了,他們都買到了書,但是庫存只有一本,他們怎么可能都成功呢?再看看數據表里book_number的內容,已經變成“-1”了,這當然是不能允許的(實際上,聲明這樣的列類型應該加上unsigned的屬性,以保證其不能為負,這里是為了說明問題所以沒有這樣設置)

好了,問題陳述清楚了,再來看看怎么利用事務來解決這個問題,打開MySQL手冊,可以看到想用事務來保護你的SQL正確執行其實很簡單,基本就是三個語句:開始,提交,回滾。

開始:START TRANSACTION或BEGIN語句可以開始一項新的事務

提交:COMMIT可以提交當前事務,是變更成為***變更

回滾:ROLLBACK可以回滾當前事務,取消其變更

此外,SET AUTOCOMMIT = {0 | 1}可以禁用或啟用默認的autocommit模式,用于當前連接。

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

 

  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;  

 

答案是否定了,這樣依然不能避免問題的發生,如果想避免這樣的情況,實際應該如下:

 

  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,所以會在此條記錄上加上一個行鎖,如果此事務沒有完全結束,那么其他的事務在使用SELECT ... FOR UPDATE請求的時候就會處于等待狀態,直到上一個事務結束,它才能繼續,從而避免了問題的發生,需要注意的是,如果你其他的事務使用的是不帶FOR UPDATE的SELECT語句,將得不到這種保護。

以上的相關內容就是對MySQL數據庫與事務的介紹,望你能有所收獲。

【編輯推薦】

  1. 實現MySQL 用戶密碼的設置步驟
  2. MySQL數據庫安全設置的操作流程
  3. 使用MySQL 數據庫出現的困難解決
  4. MySQL使用方法匯總描述
  5. MySQL mysqldump命令的正確應用


 

責任編輯:佚名 來源: cnblogs
相關推薦

2011-08-05 14:02:17

MySQL數據庫異常處理

2014-11-05 10:37:44

Windows Pho數據庫

2010-04-15 08:57:29

Oracle數據庫

2016-12-29 12:24:33

MySQL數據庫移植

2019-01-02 11:10:40

MySQL數據庫數據庫設計

2017-08-22 17:10:45

數據庫MySQL事務模型

2020-06-17 16:56:36

數據庫MySQL跨行事務

2019-07-11 08:45:00

MySQL數據庫緩存

2010-05-14 14:38:03

安裝MySQL

2024-04-08 10:11:15

MYSQL數據庫事務

2010-07-23 15:03:02

SQL Server數

2009-09-24 14:12:22

Hibernate數據

2010-10-08 09:38:55

Android數據庫事

2022-05-09 15:52:23

MySQL數據庫數據庫表

2024-11-27 11:39:02

2018-08-01 14:00:49

MySQL數據庫PHP

2010-11-15 10:30:04

Oracle數據庫啟動

2017-11-08 10:20:10

2009-05-08 09:56:37

MaxDBMySQL數據庫管理

2025-04-08 06:00:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人亚洲天堂 | 日一区二区| 亚洲午夜三级 | 欧美一级大片 | 综合国产 | 欧美一区二区精品 | 99精品99久久久久久宅男 | 成人三级视频 | 欧美激情一区二区 | 午夜在线视频一区二区三区 | 欧美成年黄网站色视频 | 男女网站免费 | 欧美国产日韩一区二区三区 | 伊伊综合网 | 国内精品伊人久久久久网站 | 综合久久综合久久 | 亚洲综合三区 | 欧美精品在线一区二区三区 | 日本天堂视频 | 精品国产黄色片 | 亚洲一区在线日韩在线深爱 | 国产在线视频在线观看 | 黄色av免费| 亚洲黄色高清视频 | 99国产精品99久久久久久粉嫩 | 国产精品毛片在线 | 国产一区二区精品在线观看 | 亚洲综合区 | 亚洲精品免费在线观看 | 国产精品久久久久久久久久 | 欧美在线一区二区三区 | 亚洲精品免费在线 | 欧美成人专区 | 欧美一区二区三区免费电影 | 免费的网站www| 亚洲色图综合 | 免费亚洲婷婷 | 综合久久av | 二区三区av | 国产精品一区二区三区在线 | 欧美aaaaaaaaaa |