最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2020年02月19日 12:11:25   作者:懷素真  
這篇文章主要介紹了mysql的事務(wù),隔離級別和鎖用法,結(jié)合實例形式分析了MySQL事務(wù),隔離級別和鎖相關(guān)原理、用法及操作注意事項,需要的朋友可以參考下

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

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

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

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

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

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

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

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

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

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

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

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

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

讀已提交 read committed

×

可重復(fù)讀取 repeatable read

×

×

序列化 serializable

×

×

×

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

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

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

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

對于mysql8而言,使用下面的變量進行查詢

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

設(shè)置隔離級別

SET GLOBAL tx_isolation = '隔離級別';
SET SESSION tx_isolation = '隔離級別';
SET @@tx_isolation = '隔離級別';

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

SET GLOBAL transaction_isolation = '隔離級別';
SET SESSION transaction_isolation = '隔離級別';
SET @@transaction_isolation = '隔離級別';

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

先準備一張表,和一點數(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ù)。如果因為某些原因,事務(wù)B回滾了,事務(wù)A讀取的這個數(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ù)讀的問題。

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

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

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

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

4、序列化

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

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

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

此時對表的讀寫都會進行鎖表,當然對并發(fā)性能的影響也比較大。

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

六、mysql的鎖

鎖分為兩種類型:

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

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

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

1、行級鎖:行級鎖是細粒度的,只有被訪問的行會被鎖定,這允許多個會話同時進行寫訪問。

2、表級鎖:mysql對myisam,memory和merge表使用表級鎖,一次只允許一個會話更新表,這使得這些存儲引擎更適用于以讀取為主的操作。

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

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

WRITE (排他鎖) :當表被 WRITE 鎖定時,除持有該鎖的會話外,其他會話都不能讀取或?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存儲過程技巧大全》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總

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

相關(guān)文章

  • Linux環(huán)境下mysql5.7.13安裝教程

    Linux環(huán)境下mysql5.7.13安裝教程

    這篇文章主要為大家詳細介紹了Linux環(huán)境下mysql5.7.13安裝教程,感興趣的小伙伴們可以參考一下
    2016-07-07
  • MySQL中連接查詢和子查詢的問題

    MySQL中連接查詢和子查詢的問題

    這篇文章主要介紹了MySQL中連接查詢和子查詢的問題,本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • MySQL如何開啟用戶遠程登錄權(quán)限

    MySQL如何開啟用戶遠程登錄權(quán)限

    這篇文章主要介紹了MySQL如何開啟用戶遠程登錄權(quán)限問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • MySQL的幾種分頁方式,你知道幾種方式

    MySQL的幾種分頁方式,你知道幾種方式

    這篇文章主要介紹了MySQL的幾種分頁方式,需要的朋友可以參考下
    2023-06-06
  • MySQL定時備份方案(利用Linux crontab)

    MySQL定時備份方案(利用Linux crontab)

    這篇文章主要給大家介紹了關(guān)于MySQL定時備份方案的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-07-07
  • MySQL多個字段拼接去重的實現(xiàn)示例

    MySQL多個字段拼接去重的實現(xiàn)示例

    在MySQL中,我們經(jīng)常會遇到需要將多個字段進行拼接并去重的情況,本文就來介紹一下MySQL多個字段拼接去重的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • 詳解MySQL數(shù)據(jù)庫之觸發(fā)器

    詳解MySQL數(shù)據(jù)庫之觸發(fā)器

    這篇文章主要介紹了MySQL數(shù)據(jù)庫之觸發(fā)器的相關(guān)資料,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-09-09
  • 簡單了解添加mysql索引的3條原則

    簡單了解添加mysql索引的3條原則

    這篇文章主要介紹了簡單了解添加mysql索引的3條原則,如果表中查詢的列有一個索引,MySQL能快速到達一個位置去搜尋到數(shù)據(jù)文件的中間,沒有必要看所有數(shù)據(jù),需要的朋友可以參考下
    2019-06-06
  • mysql實現(xiàn)不用密碼登錄的實例方法

    mysql實現(xiàn)不用密碼登錄的實例方法

    在本篇文章里小編給大家整理的是一篇關(guān)于mysql實現(xiàn)不用密碼登錄的實例方法,有需要的朋友們可以學習參考下。
    2020-08-08
  • 深入講解數(shù)據(jù)庫中Decimal類型的使用以及實現(xiàn)方法

    深入講解數(shù)據(jù)庫中Decimal類型的使用以及實現(xiàn)方法

    MySQL?DECIMAL數(shù)據(jù)類型用于在數(shù)據(jù)庫中存儲精確的數(shù)值,我們經(jīng)常將DECIMAL數(shù)據(jù)類型用于保留準確精確度的列,例如會計系統(tǒng)中的貨幣數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫中Decimal類型的使用以及實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2022-02-02

最新評論

临沂市| 西丰县| 荔波县| 临武县| 广昌县| 茂名市| 汉沽区| 东宁县| 绥化市| 阿尔山市| 明水县| 宜州市| 安庆市| 沙河市| 白朗县| 广南县| 万源市| 佛山市| 邹平县| 云龙县| 涿州市| 闽侯县| 观塘区| 敦煌市| 健康| 涪陵区| 兴仁县| 秦安县| 班玛县| 连山| 广德县| 乌鲁木齐市| 赫章县| 韶山市| 马尔康县| 左贡县| 浦江县| 白玉县| 修水县| 塘沽区| 门头沟区|