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

一文帶你了解MySQL中的事務

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

一.什么是事務

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

比如:在銀行轉賬時,必須保證轉賬絕對安全,這時需要事務參與

 -- id為1的賬戶轉賬給id為2的賬戶
update account set money=money -200 where id=1;
update account set money=money +200 where id=2;

思考

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

二.事務操作

MySQL的事務操作主要有以下三種

1.開啟事務:start Transaction

  • 任何一條DML語句( insert、update、delete)執(zhí)行,標志事務的開啟
  • 命令:BEGIN 或 START TRANSACTION

2.提交事務:commit Transaction

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

3.回滾事務

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

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

在MySQL中直接用SET來改變MySQL的自動提交模式:

演示

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);
 
-- 設置MySQL的事務為手動提交(關閉自動提交)
select @@autocommit;-- 輸出1指開啟
set autocommit=0;
 
-- 模擬賬戶轉賬
-- 開啟事務
begin;
update account set money=money -200 where id=1;
update account set money=money +200 where id=2;
-- 提交事務
commit;
 
-- 回滾事務
rollback;
 
select * from account a ;

不提交直接查詢的結果是

但是

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

這是因為select查的是最新的內存上的變化

當開啟事務還未提交之前,執(zhí)行回滾事務語句,那么就會撤銷開啟事務中執(zhí)行的語句

小結

begin開啟后要么commit提交落盤要么rollback回滾落盤,先運行開啟,在執(zhí)行SQL語句,最后執(zhí)行commit或者rollback

三.事務的特性

1.原子性

事務是一個不可分割的整體,事務開始后的所有操作,要么全部完成,要么全部不做

2.一致性

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

3.隔離性

每個事務的對象對其他事務的操作對象互相分離,事務提交前對其他事務不可見

4.持久性

事務一旦提交,則其結果是永久性的

四.事務的隔離級別

概述

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

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

四種隔離級別

1、讀未提交(Read uncommitted)

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

2、讀已提交(Read committed)

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

3、可重復讀(Repeatable read)

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

4、串行(Serializable)

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

Mysql的默認隔離級別是Repeatable read

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

臟讀、不可重復讀、幻讀

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

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

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

不可重復讀和幻讀比較:

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

操作

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

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

相關文章

  • mysql登錄報錯提示:ERROR 1045 (28000)的解決方法

    mysql登錄報錯提示:ERROR 1045 (28000)的解決方法

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

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

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

    MySQL常用慢查詢分析工具詳解

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

    mysql數(shù)據(jù)校驗過程中的字符集問題處理

    在日常應用中,我們經(jīng)常會遇到在不同的字符集的數(shù)據(jù)庫直接進行數(shù)據(jù)的導入導出操作,針對這個問題,我們來進行討論下
    2014-05-05
  • MySQL select查詢之LIKE與通配符用法

    MySQL select查詢之LIKE與通配符用法

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

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

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

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

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

    MySQL中的JSON字段List成員檢查

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

    IDEA連接mysql又報錯!Server returns invalid timezone. Go to tab an

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

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

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

最新評論

青州市| 慈利县| 吉隆县| 浦县| 车险| 深泽县| 宜章县| 上蔡县| 富川| 竹山县| 金溪县| 托克逊县| 巴塘县| 黄山市| 禄劝| 临洮县| 孙吴县| 永昌县| 乌兰察布市| 龙口市| 临沧市| 瑞丽市| 应用必备| 抚松县| 慈溪市| 南陵县| 铜鼓县| 托里县| 莲花县| 彰化县| 余干县| 高密市| 镇巴县| 达拉特旗| 木里| 东丰县| 舞阳县| 临沧市| 洛南县| 桂林市| 涟源市|