校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識(shí)庫 > mysql的事務(wù),隔離級(jí)別和鎖用法實(shí)例分析

mysql的事務(wù),隔離級(jí)別和鎖用法實(shí)例分析

熱門標(biāo)簽:博樂電銷機(jī)器人 鄭州網(wǎng)絡(luò)外呼系統(tǒng)價(jià)錢 怎么更改高德地圖標(biāo)注 400電話到哪辦理優(yōu)惠 機(jī)器人打電銷電話 電話機(jī)器人是電腦呼號(hào)嗎 云南大數(shù)據(jù)外呼系統(tǒng) 上海市三維地圖標(biāo)注 南寧外呼系統(tǒng)招商

本文實(shí)例講述了mysql的事務(wù),隔離級(jí)別和鎖用法。分享給大家供大家參考,具體如下:

事務(wù)就是一組一起成功或一起失敗的sql語句。事務(wù)還應(yīng)該具備,原子性,一致性,隔離性和持久性。

一、事務(wù)的基本要素 (ACID)

1、原子性:事務(wù)開始后,所有的操作,要么全部成功,要么全部失敗,不可能處于中間狀態(tài),事務(wù)是一個(gè)不可分割的整體,就像原子一樣。

2、一致性:事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的完整性約束沒有破壞,A向B轉(zhuǎn)賬,A扣了錢,但B卻沒到賬。

3、隔離性:同時(shí)發(fā)生的事務(wù)(并發(fā)事務(wù))不應(yīng)該導(dǎo)致數(shù)據(jù)庫處于不一致的狀態(tài)中,每個(gè)事務(wù)都獨(dú)立執(zhí)行,不影響其他事務(wù)的存在。

4、持久性:事務(wù)對(duì)數(shù)據(jù)庫的更改都會(huì)保存在磁盤上,不會(huì)丟失。

二、事務(wù)的并發(fā)問題

1、臟讀:事務(wù)A讀取了事務(wù)B未提交的寫入數(shù)據(jù),讀取到的數(shù)據(jù)就稱為臟數(shù)據(jù)

2、不可重復(fù)讀:事務(wù)A多次讀取同一數(shù)據(jù),但在讀取過程中,事務(wù)B對(duì)數(shù)據(jù)做了修改,并提交了。導(dǎo)致多次讀取同一數(shù)據(jù),結(jié)果不一樣。

3、幻讀:事務(wù)A對(duì)表中所有數(shù)據(jù)行進(jìn)行了修改,比如設(shè)置status = 1,但同時(shí),事務(wù)B往該表插入了一行新數(shù)據(jù)status = 0,對(duì)于操作事務(wù)A的用戶而言,表中還有一條記錄沒被修改,就像發(fā)生幻覺一樣。

三、事務(wù)隔離性的四個(gè)級(jí)別

事務(wù)隔離級(jí)別 臟讀 不可重復(fù)讀 幻讀
讀取未提交 read uncommitted

讀已提交 read committed

×

可重復(fù)讀取 repeatable read

×

×

序列化 serializable

×

×

×

四、獲取和設(shè)置數(shù)據(jù)庫隔離級(jí)別

SHOW VARIABLES LIKE '%isolation%';
SHOW GLOBAL VARIABLES LIKE '%isolation%';

使用系統(tǒng)變量查詢

SELECT @@GLOBAL.tx_isolation;
SELECT @@SESSION.tx_isolation;
SELECT @@tx_isolation;

對(duì)于mysql8而言,使用下面的變量進(jìn)行查詢

SELECT @@GLOBAL.transaction_isolation;
SELECT @@SESSION.transaction_isolation;
SELECT @@transaction_isolation;

設(shè)置隔離級(jí)別

SET GLOBAL tx_isolation = '隔離級(jí)別';
SET SESSION tx_isolation = '隔離級(jí)別';
SET @@tx_isolation = '隔離級(jí)別';

對(duì)于mysql8而言,使用下面語句進(jìn)行設(shè)置

SET GLOBAL transaction_isolation = '隔離級(jí)別';
SET SESSION transaction_isolation = '隔離級(jí)別';
SET @@transaction_isolation = '隔離級(jí)別';

五、通過例子說明各隔離級(jí)別的情況

先準(zhǔn)備一張表,和一點(diǎn)數(shù)據(jù)。

CREATE TABLE `account` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `name` varchar(32) DEFAULT '' COMMENT '名稱',
 `money` decimal(11,2) DEFAULT '0.00' COMMENT '金錢',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `account` (`name`, `money`) VALUES ('A', '500.00');
INSERT INTO `account` (`name`, `money`) VALUES ('B', '100.00');

1、讀取未提交

set transaction_isolation = 'READ-UNCOMMITTED';
set autocommit = 0;

事務(wù)B修改了表中的數(shù)據(jù),但是未提交,事務(wù)A確讀取到了修改后的數(shù)據(jù)。如果因?yàn)槟承┰颍聞?wù)B回滾了,事務(wù)A讀取的這個(gè)數(shù)據(jù)就是臟數(shù)據(jù)。

2、讀已提交

set transaction_isolation = 'READ-COMMITTED';
set autocommit = 0;

事務(wù)B修改數(shù)據(jù)但沒有提交,那么事務(wù)A仍然獲取的原來數(shù)據(jù),解決了臟讀的問題。

但是事務(wù)B提交,事務(wù)A執(zhí)行上一次查詢,結(jié)果與上一次查詢不一致,這就產(chǎn)生不可重復(fù)讀的問題。

3、可重復(fù)讀取

set transaction_isolation = 'REPEATABLE-READ';
set autocommit = 0;

事務(wù)B修改了數(shù)據(jù)并提交了,事務(wù)A兩次查詢的結(jié)果是一致的,解決了不可重復(fù)讀的問題。

這個(gè)時(shí)候,事務(wù)A去修改name為A的money數(shù)據(jù)

name為A的money變成了350,而不是400,可重復(fù)讀保證了數(shù)據(jù)的一致性。

我們重新在事務(wù)A中修改所有賬號(hào)的money等于200,同時(shí)在事務(wù)B中插入一條新的數(shù)據(jù)。

事務(wù)A中獲取的仍然是兩條數(shù)據(jù),解決了新增數(shù)據(jù)時(shí),事務(wù)A出現(xiàn)的幻讀問題。

4、序列化

set transaction_isolation = 'SERIALIZABLE';
set autocommit = 0;

事務(wù)A對(duì)表進(jìn)行查詢,如果沒有提交,則事務(wù)B的插入語句一直等待在那里,直到超時(shí)或事務(wù)A提交。

反之,事務(wù)B對(duì)表進(jìn)行插入后,沒有提交,則事務(wù)A對(duì)表的查詢也一直等待,直到事務(wù)B提交。

此時(shí)對(duì)表的讀寫都會(huì)進(jìn)行鎖表,當(dāng)然對(duì)并發(fā)性能的影響也比較大。

隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性。

六、mysql的鎖

鎖分為兩種類型:

內(nèi)部鎖:mysql服務(wù)器內(nèi)部執(zhí)行的內(nèi)部鎖,以管理多個(gè)會(huì)話對(duì)表內(nèi)容的爭(zhēng)用。

外部鎖:mysql為客戶會(huì)話提供顯式地獲取表鎖,以阻止其他會(huì)話訪問表。

內(nèi)部鎖又會(huì)為兩種類型:

1、行級(jí)鎖:行級(jí)鎖是細(xì)粒度的,只有被訪問的行會(huì)被鎖定,這允許多個(gè)會(huì)話同時(shí)進(jìn)行寫訪問。

2、表級(jí)鎖:mysql對(duì)myisam,memory和merge表使用表級(jí)鎖,一次只允許一個(gè)會(huì)話更新表,這使得這些存儲(chǔ)引擎更適用于以讀取為主的操作。

外部鎖:可以使用 LOCK TABLE 和 UNLOCK TABLE 來控制鎖定。

READ (共享鎖) :多個(gè)會(huì)話可以從表中讀取數(shù)據(jù)而不需要獲取鎖,此外,多個(gè)會(huì)話可以在同一表上獲得鎖,當(dāng) READ 鎖時(shí),沒有會(huì)話可以將數(shù)據(jù)寫入表中。任何寫入操作都將處于等待狀態(tài),直到 READ 鎖被釋放。

WRITE (排他鎖) :當(dāng)表被 WRITE 鎖定時(shí),除持有該鎖的會(huì)話外,其他會(huì)話都不能讀取或?qū)懭霐?shù)據(jù),除非 WRITE 鎖被釋放。

鎖表的語句:

LOCK TABLES table_name [READ | WRITE];

解鎖表的語句:

UNLOCK TABLES;

鎖定數(shù)據(jù)庫中所有表:

FLUSH TABLES WITH READ LOCK;

更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL索引操作技巧匯總》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過程技巧大全》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》

希望本文所述對(duì)大家MySQL數(shù)據(jù)庫計(jì)有所幫助。

您可能感興趣的文章:
  • MySQL中Innodb的事務(wù)隔離級(jí)別和鎖的關(guān)系的講解教程
  • 關(guān)于Mysql隔離級(jí)別、鎖與MVCC介紹
  • 深入理解Mysql的四種隔離級(jí)別
  • MySQL 四種事務(wù)隔離級(jí)別詳解及對(duì)比
  • MySQL四種事務(wù)隔離級(jí)別詳解
  • Mysql事務(wù)隔離級(jí)別之讀提交詳解
  • MySQL數(shù)據(jù)庫事務(wù)隔離級(jí)別詳解
  • MySQL隔離級(jí)別和鎖機(jī)制的深入講解

標(biāo)簽:益陽 定西 恩施 寧夏 杭州 白銀 澳門 秦皇島

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql的事務(wù),隔離級(jí)別和鎖用法實(shí)例分析》,本文關(guān)鍵詞  mysql,的,事務(wù),隔離,級(jí)別,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql的事務(wù),隔離級(jí)別和鎖用法實(shí)例分析》相關(guān)的同類信息!
  • 本頁收集關(guān)于mysql的事務(wù),隔離級(jí)別和鎖用法實(shí)例分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 河北省| 禹州市| 盐池县| 晋中市| 滦南县| 溧阳市| 吉木萨尔县| 霍城县| 利津县| 巴南区| 江永县| 东城区| 屯昌县| 轮台县| 新田县| 金寨县| 榆林市| 封丘县| 静海县| 永州市| 大厂| 中宁县| 韩城市| 闵行区| 伊川县| 南岸区| 防城港市| 明溪县| 汉沽区| 宜春市| 静乐县| 沈阳市| 平湖市| 乌鲁木齐市| 车致| 大余县| 田阳县| 武清区| 东光县| 正阳县| 娄底市|