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

一文帶你了解MySQL中的事務(wù)

 更新時(shí)間:2023年02月17日 10:22:04   作者:陽(yáng)862  
事務(wù)處理可以用來(lái)維護(hù)數(shù)據(jù)庫(kù)的完整性,保證成批的sQL語(yǔ)句要么全部執(zhí)行,要么全部不執(zhí)行。本文將通過(guò)一些簡(jiǎn)單的示例帶大家了解一下MySQL中的事務(wù),希望對(duì)大家有所幫助

一.什么是事務(wù)

  • 在MySQL中的事務(wù)(Transaction)是由存儲(chǔ)引擎實(shí)現(xiàn)的,在MySQL中,只有InnoDB存儲(chǔ)引擎才支持事務(wù)。
  • 事務(wù)處理可以用來(lái)維護(hù)數(shù)據(jù)庫(kù)的完整性,保證成批的sQL語(yǔ)句要么全部執(zhí)行,要么全部不執(zhí)行。
  • 事務(wù)用來(lái)管理DDL、DML、DCL操作,比如insert,update,delete語(yǔ)句,默認(rèn)是自動(dòng)提交的。

比如:在銀行轉(zhuǎn)賬時(shí),必須保證轉(zhuǎn)賬絕對(duì)安全,這時(shí)需要事務(wù)參與

 -- id為1的賬戶(hù)轉(zhuǎn)賬給id為2的賬戶(hù)
update account set money=money -200 where id=1;
update account set money=money +200 where id=2;

思考

假如在第一次update之后,出現(xiàn)了意外、異常,沒(méi)有執(zhí)行第二次update,這時(shí)轉(zhuǎn)賬是否會(huì)出現(xiàn)異常?

二.事務(wù)操作

MySQL的事務(wù)操作主要有以下三種

1.開(kāi)啟事務(wù):start Transaction

  • 任何一條DML語(yǔ)句( insert、update、delete)執(zhí)行,標(biāo)志事務(wù)的開(kāi)啟
  • 命令:BEGIN 或 START TRANSACTION

2.提交事務(wù):commit Transaction

  • 成功的結(jié)束,將所有的DML語(yǔ)句操作歷史記錄和底層硬盤(pán)數(shù)據(jù)來(lái)一次同步
  • 命令:COMMIT

3.回滾事務(wù)

  • 失敗的結(jié)束,將所有的DML語(yǔ)句操作歷史記錄全部清空
  • 命令:ROLLBACK

之前的所有SQL操作其實(shí)也有事務(wù),只是MysQL自動(dòng)幫我們完成的,每執(zhí)行一條SQL時(shí)MySQL就幫我們自動(dòng)提交事務(wù),因此如果想要手動(dòng)控制事務(wù),則必須關(guān)閉MySQL的事務(wù)自動(dòng)提交。

在MySQL中直接用SET來(lái)改變MySQL的自動(dòng)提交模式:

演示

create database test_transaction;
use test_transaction;
 
create table account(
	id int primary key,
	name varchar(20),
	money double
 
);
 
insert into account values(1,'張三',1000),(2,'李四',1000);
 
-- 設(shè)置MySQL的事務(wù)為手動(dòng)提交(關(guān)閉自動(dòng)提交)
select @@autocommit;-- 輸出1指開(kāi)啟
set autocommit=0;
 
-- 模擬賬戶(hù)轉(zhuǎn)賬
-- 開(kāi)啟事務(wù)
begin;
update account set money=money -200 where id=1;
update account set money=money +200 where id=2;
-- 提交事務(wù)
commit;
 
-- 回滾事務(wù)
rollback;
 
select * from account a ;

不提交直接查詢(xún)的結(jié)果是

但是

在圖形上數(shù)字需要提交后才可以正常顯示

這是因?yàn)閟elect查的是最新的內(nèi)存上的變化

當(dāng)開(kāi)啟事務(wù)還未提交之前,執(zhí)行回滾事務(wù)語(yǔ)句,那么就會(huì)撤銷(xiāo)開(kāi)啟事務(wù)中執(zhí)行的語(yǔ)句

小結(jié)

begin開(kāi)啟后要么commit提交落盤(pán)要么rollback回滾落盤(pán),先運(yùn)行開(kāi)啟,在執(zhí)行SQL語(yǔ)句,最后執(zhí)行commit或者rollback

三.事務(wù)的特性

1.原子性

事務(wù)是一個(gè)不可分割的整體,事務(wù)開(kāi)始后的所有操作,要么全部完成,要么全部不做

2.一致性

系統(tǒng)從一個(gè)正確的狀態(tài),遷移到另一個(gè)正確的狀態(tài)

3.隔離性

每個(gè)事務(wù)的對(duì)象對(duì)其他事務(wù)的操作對(duì)象互相分離,事務(wù)提交前對(duì)其他事務(wù)不可見(jiàn)

4.持久性

事務(wù)一旦提交,則其結(jié)果是永久性的

四.事務(wù)的隔離級(jí)別

概述

lsolate,顧名思義就是將事務(wù)與另一個(gè)事務(wù)隔離開(kāi),為什么要隔離呢?如果一個(gè)事務(wù)正在操作的數(shù)據(jù)被另一個(gè)事務(wù)修改或刪除了,最后的執(zhí)行結(jié)果可能無(wú)法達(dá)到預(yù)期。如果沒(méi)有隔離性還會(huì)導(dǎo)致其他問(wèn)題。

如上圖,越往上兩個(gè)事務(wù)之間的關(guān)聯(lián)程度越緊密,越往下越安全但效率越低。

四種隔離級(jí)別

1、讀未提交(Read uncommitted)

一個(gè)事務(wù)可以讀取另一個(gè)未提交事務(wù)的數(shù)據(jù),最低級(jí)別,任何情況都無(wú)法保證,會(huì)造成臟讀。

2、讀已提交(Read committed)

一個(gè)事務(wù)要等另一個(gè)事務(wù)提交后才能讀取數(shù)據(jù),可避免臟讀的發(fā)生,會(huì)造成不可重復(fù)讀。

3、可重復(fù)讀(Repeatable read)

就是在開(kāi)始讀取數(shù)據(jù)(事務(wù)開(kāi)啟)時(shí),不再允許修改操作,可避免臟讀、不可重復(fù)讀的發(fā)生,但是會(huì)造成幻讀。

4、串行(Serializable)

是最高的事務(wù)隔離級(jí)別,在該級(jí)別下,事務(wù)串行化順序執(zhí)行,可以避免臟讀、不可重復(fù)讀與幻讀。但是這種事務(wù)隔離級(jí)別效率低下,比較耗數(shù)據(jù)庫(kù)性能,一般不使用。

Mysql的默認(rèn)隔離級(jí)別是Repeatable read

事務(wù)隔離級(jí)別臟讀不可重復(fù)讀幻讀
讀未提交(Read uncommitted)
讀已提交(Read committed)
可重復(fù)讀(Repeatable read)
串行(Serializable)

臟讀、不可重復(fù)讀、幻讀

臟讀:所謂的臟讀,其實(shí)就是讀到了別的事務(wù)回滾前的臟數(shù)據(jù)。比如事務(wù)B執(zhí)行過(guò)程中修改了數(shù)據(jù)X,在未提交前,事務(wù)A讀取了X,而事務(wù)B卻回滾了,這樣事務(wù)A就形成了臟讀。

不可重復(fù)讀:事務(wù)A首先讀取了一條數(shù)據(jù),然后執(zhí)行邏輯的時(shí)候,事務(wù)B將這條數(shù)據(jù)改變了,然后事務(wù)A再次讀取的時(shí)候,發(fā)現(xiàn)數(shù)據(jù)不匹配了,就是所謂的不可重復(fù)讀了。

幻讀:事務(wù)A首先根據(jù)條件索引得到N條數(shù)據(jù),然后事務(wù)B改變了這N條數(shù)據(jù)之外的M條或者增添了M條符合事務(wù)A搜索條件的數(shù)據(jù),導(dǎo)致事務(wù)A再次搜索發(fā)現(xiàn)有N+M條數(shù)據(jù)了,就產(chǎn)生了幻讀。

不可重復(fù)讀和幻讀比較:

兩者有些相似,但是前者針對(duì)的是update或delete,后者針對(duì)的insert。

操作

-- 查看隔離級(jí)別
show variables like '%isolation%';
 
-- 設(shè)置隔離級(jí)別
/*
 set session transaction isolation level 級(jí)別字符串
 級(jí)別字符串:read uncommitted、read committed、repeatable read、serializable
 */
 
-- 設(shè)置read uncommitted 
set session transaction isolation level read uncommitted;
-- 這種隔離級(jí)別會(huì)引起臟讀,A事務(wù)讀取到B事務(wù)沒(méi)有提交的數(shù)據(jù)
 
-- 設(shè)置read committed
set session transaction isolation level read committed;
-- 這種隔離級(jí)別會(huì)引起不可重復(fù)讀,A事務(wù)在沒(méi)有提交事務(wù)之前,可看到數(shù)據(jù)不一致
 
 
-- 設(shè)置repeatable read(MysQ默認(rèn)的)
set session transaction isolation level repeatable read;
-- 這種隔離級(jí)別會(huì)引起幻讀,A事務(wù)在提交之前和提交之后看到的數(shù)據(jù)不一致
 
-- 設(shè)置serializable
set session transaction isolation level serializable;
-- 這種隔離級(jí)別比較安全,但是效率低,A事務(wù)操作表時(shí),表會(huì)被鎖起,B事務(wù)不能操作。

到此這篇關(guān)于一文帶你了解MySQL中的事務(wù)的文章就介紹到這了,更多相關(guān)MySQL事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql登錄報(bào)錯(cuò)提示:ERROR 1045 (28000)的解決方法

    mysql登錄報(bào)錯(cuò)提示:ERROR 1045 (28000)的解決方法

    這篇文章主要介紹了mysql登錄報(bào)錯(cuò)提示:ERROR 1045 (28000)的解決方法,詳細(xì)分析了出現(xiàn)MySQL登陸錯(cuò)誤的原因與對(duì)應(yīng)的解決方法,需要的朋友可以參考下
    2016-04-04
  • 阿里云配置MySQL-server?8.0遠(yuǎn)程登錄的實(shí)現(xiàn)

    阿里云配置MySQL-server?8.0遠(yuǎn)程登錄的實(shí)現(xiàn)

    我們經(jīng)常會(huì)碰到需要遠(yuǎn)程訪問(wèn)數(shù)據(jù)庫(kù)的場(chǎng)景,本文主要介紹了阿里云配置MySQL-server?8.0遠(yuǎn)程登錄的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • MySQL常用慢查詢(xún)分析工具詳解

    MySQL常用慢查詢(xún)分析工具詳解

    這篇文章主要介紹了MySQL常用慢查詢(xún)分析工具詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • mysql數(shù)據(jù)校驗(yàn)過(guò)程中的字符集問(wèn)題處理

    mysql數(shù)據(jù)校驗(yàn)過(guò)程中的字符集問(wèn)題處理

    在日常應(yīng)用中,我們經(jīng)常會(huì)遇到在不同的字符集的數(shù)據(jù)庫(kù)直接進(jìn)行數(shù)據(jù)的導(dǎo)入導(dǎo)出操作,針對(duì)這個(gè)問(wèn)題,我們來(lái)進(jìn)行討論下
    2014-05-05
  • MySQL select查詢(xún)之LIKE與通配符用法

    MySQL select查詢(xún)之LIKE與通配符用法

    這篇文章主要介紹了MySQL select查詢(xún)之LIKE與通配符用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • win10下mysql5.7.21解壓版安裝教程

    win10下mysql5.7.21解壓版安裝教程

    這篇文章主要為大家詳細(xì)介紹了win10下mysql5.7.21解壓版安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 詳解一條update語(yǔ)句是怎樣執(zhí)行原理解析

    詳解一條update語(yǔ)句是怎樣執(zhí)行原理解析

    這篇文章主要為大家介紹了詳解一條update語(yǔ)句是怎樣執(zhí)行原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • MySQL中的JSON字段List成員檢查

    MySQL中的JSON字段List成員檢查

    這篇文章主要介紹了MySQL中的JSON字段List成員檢查,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • IDEA連接mysql又報(bào)錯(cuò)!Server returns invalid timezone. Go to tab and set serverTimezone  prope的問(wèn)題

    IDEA連接mysql又報(bào)錯(cuò)!Server returns invalid timezone. Go to tab an

    這篇文章主要介紹了IDEA連接mysql又報(bào)錯(cuò)!Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' prope問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2020-05-05
  • MySQL中增量備份的幾種實(shí)現(xiàn)方法

    MySQL中增量備份的幾種實(shí)現(xiàn)方法

    MySQL數(shù)據(jù)庫(kù)的增量備份是確保數(shù)據(jù)安全和可恢復(fù)性的關(guān)鍵策略,本文就來(lái)介紹一下如何實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01

最新評(píng)論

中山市| 应城市| 含山县| 宜宾市| 聂拉木县| 来凤县| 通江县| 静安区| 汤阴县| 淮南市| 芜湖市| 永新县| 沙雅县| 马龙县| 江陵县| 扬中市| 玉林市| 许昌市| 文昌市| 江永县| 丹东市| 松原市| 宣威市| 静乐县| 双峰县| 邢台市| 仪陇县| 大荔县| 西峡县| 健康| 凤山县| 沽源县| 襄汾县| 全州县| 自治县| 福贡县| 栾城县| 桃园县| 土默特右旗| 玉树县| 沙坪坝区|