MySQL 事務管理

来源:https://www.cnblogs.com/chy18883701161/archive/2020/03/10/12445297.html
-Advertisement-
Play Games

事務的4個特性(ACID) 原子性 Atomicity。每個事務中的操作,要麼都成功,要麼都失敗 一致性 Consistency。事務執行前後,資料庫中的數據應該保持一致 隔離性 Isolation。事務之間應該是隔離的,事務之間互不影響、干擾 持久性 Durability。事務一旦提交,便會將修改 ...


 

事務的4個特性(ACID)

  • 原子性 Atomicity。每個事務中的操作,要麼都成功,要麼都失敗
  • 一致性 Consistency。事務執行前後,資料庫中的數據應該保持一致
  • 隔離性 Isolation。事務之間應該是隔離的,事務之間互不影響、干擾
  • 持久性 Durability。事務一旦提交,便會將修改持久化到資料庫

 

 

事務管理的相關命令

start transaction;  #開始事務
sql語句1;
sql語句2;
.....

commit; #提交事務

#rollback; #回滾

 

 

 

流程示例

start transaction;

insert into tb_user (name,age) values ('zhangsan',20);  #顯示Query OK,這條sql語句可以成功執行

insert into tb_user (name,age) values ('李四','age');  #顯示ERROR,發生錯誤。只是說這條語句執行錯誤,但後面還可以執行sql語句

insert into tb_user (name,age) values ('wangwu',20);  #顯示Query OK,

 

如果此時commit;提交,會把執行成功的2個sql語句做的修改持久化資料庫,失敗的sql語句則忽略。

其實發生ERROR時,為了做到事務的原子性,就應該rollback;回滾。

並不是說start transaction;  .....  commit;  會自動維持事務的4個特性,全部成功就持久化到資料庫,某些sql語句發生錯誤,就自動回滾,不是這樣的。

事務的4個特性需要我們自己來維持。

 

 

代碼中使用事務也一樣:

......   //開啟事務

try{

  ..... //要執行的多條sql語句

      commit;  //若前面都正常執行,則提交

}catch(Exception e){

  rollback;  //發生錯誤就回滾

}

先開啟事務,把要執行的多個sql語句放到try中,都正確執行那就提交,發生錯誤就回滾。

 

 


 

 

catch就是對異常的處理,既然捕獲了異常進行了處理,就不會往上一級拋了。

如果每一級都是throws往上拋,拋到JVM,JVM預設的異常處理方式是:列印異常信息,終止程式運行。

 

比如說下麵這段代碼:

        System.out.println(1);
        try{
            System.out.println(1/0);
        }catch (Exception e){
            System.out.println("error");
        }
        System.out.println(2);
1
error
2

並不會自動在控制台列印異常信息,終止程式。

要看異常信息,可以在catch中 System.out.println(e.getMessage()); 列印出來

 

 


 

 

 

事務的併發

事務的併發即同時執行多個事務,主要涉及事務的隔離性、隔離級別。

 

1、事務併發執行可能出現的問題

(1)臟讀     一個事務讀取其它事務尚未提交的數據

事務B對資料庫做了修改(執行成功但尚未提交),事務A讀取這些已修改的記錄,A讀取之後,B進行了回滾,A讀取到的數據變成了臟數據、無效數據,即臟讀。

隔離級別 Read commited 已提交讀,可解決臟讀問題,等到使用這些記錄的事務提交後才讀取數據。

 

 

(2)不可重覆讀     前後多次讀取,讀取的數據內容不一致(期間進行了update操作)

比如說我卡裡有2000,打算在ATM上取款2000,輸入取款金額2000點擊確定,系統查詢賬戶餘額,還有2000,是夠的;

我老婆的微信綁定了我的卡,這時把我卡裡的1000給花了,賬戶餘額為1000

ATM執行扣款-2000(在賬戶餘額的基礎上扣,money-2000,又要獲取賬戶餘額),並往外吐錢2000,1000-2000=-1000

ATM前後2次讀取餘額(同一條記錄的數據),讀取的數據內容不一致,這就出現問題了。

 

隔離級別 Repeatable read 重覆讀,可解決不可重覆讀的問題,當有事務讀了某些行的數據後,這些行會被鎖住,不允許其它事務對這些行進行修改,這樣重覆讀取到的數據就是一致的。

因為使用某些行時,這些行會被鎖定,其它事務不能讀取這些(可能會被修改的)行,也避免了臟讀問題。

 

 

(3)幻讀(虛讀)   前後多次讀取,讀取的記錄數不一致(期間進行了insert、delete操作)

隔離級別 Serializable 可解決幻讀問題,不允許事務併發,最安全,但性能最差,基本不用。

 

以上3個是讀問題,還可能產生一個寫問題:丟失更新。

 

(4)丟失更新  丟失更新是不可重覆讀中的一種特殊情況,2個事務都要修改記錄內容(update),後提交的覆蓋了前面提交的

 

時間 取款事務 支票轉賬事務
T1 開始事務  
T2   開始事務
T3 查詢賬戶餘額為1000元  
T4   查詢賬戶餘額為1000元
T5 取出100,把存款餘額改為900元  
T6 提交事務  
T7   匯入100元,把存款餘額改為1100元
T8   提交事務

-100的更新操作丟失了。

 

 

 

2、4種隔離級別

  • Read uncommitted:未提交讀,解決不了任何讀問題,安全性最低,但事務執行效率最高
  • Read committed:已提交讀,解決了臟讀,但不可重覆讀、虛讀有可能發生。oracle預設值。
  • Repeatable read:重覆度,解決了臟讀、不可重覆讀,但虛讀有可能發生。mysql預設值。
  • Serializable:串列化,不允許事務併發,可解決所有併發問題,安全性最高,但事務執行效率最低

一般折中選擇第2、3項,使用預設的即可,不必進行設置。

 

 

 

3、查看、設置隔離級別


#mysql
5
select @@tx_isolation; #查看當前會話使用的隔離級別
select @@global.tx_isolation; #查看全局設置的隔離級別


#mysql 8
select @@transaction_isolation;
#查看當前會話使用的隔離級別
select @@global.transaction_isolation; #查看全局設置的隔離級別
#mysql5、mysql8的查看方式不同,5是tx,8是transaction,如果不對應會報錯Unknown system variable 'tx_isolation'|'transaction_isolation'


#設置事務的隔離級別,5、8一樣
set session transaction isolation level repeatable read; #設置當期會話使用的隔離級別為repeatable read
set global transaction isolation level repeatable read; #設置全局使用的隔離級別是repeatable read

 

 


 

 

 

如果我們沒有使用start transaction開啟事務,預設把一條sql語句(帶分號)作為一個事務處理。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原因:mysql server使用的是8.0的版本,密碼加密方式發生了變化,使用的Navicat版本較低,不能適配8.0的mysql的加密方式。 3種解決方式: 1、下載安裝最新版的Navicat 2、打開mysql自帶的命令行客戶端,輸入密碼 ALTER USER 'root'@'localhos ...
  • 下麵講解常見 Navicat Premium中創建用戶與資料庫的命令。 #用root登錄資料庫 #創建庫 create database XXX;#創建用戶 create user 'XXX' identified by 'XXX';#給用戶賦許可權 grant all on XXX.* to 'XX ...
  • mysql5.X和mysql8.X的驅動類、jdbc連接地址、引用Jar包等都是不一樣的。 下麵對照表以mysql5.7/8.0.11為例: 類型 驅動程式(JAR) maven配置 驅動類(jdbc.driver) jbdc連接地址(jdbc.url) 備註 mysql5.7 mysql-conn ...
  • 配置僅限於跨不同網情況,網路互通情況方案和配置會更簡單一點 內網A:MySql數據轉換成Csv { "job": { "setting": { "speed": { "channel":1 } }, "content": [ { "reader": { "name": "mysqlreader", ...
  • 場景 打開Navicat-文件-新建連接-Oracle 註: 博客: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編程相關電子書、教程推送與免費下載。 實現 輸入對應的連接名、主機名,埠預設1521,服務名預設ORCL,輸入用戶 ...
  • 視圖的概念 視圖是一張虛表,將查詢結果集保存起來,作為視圖使用。實際存在的表叫作基本表。 視圖的作用 安全性。grant授權用戶只操作視圖、只讀,可以保護基本表中的數據。 提高查詢性能。視圖只是基本表的一部分,查視圖比查全表快。尤其是多表查詢的時候,查視圖一張表比連接多張表查詢要快。 視圖的常用操作 ...
  • 場景 在伺服器上的SqlServer數據導出的.sql文件,需要在本地新建一個資料庫並將資料庫導入。 首先打開電腦上的SqlServerManagementStudio 註: 博客: https://blog.csdn.net/badao_liumang_qizhi 關註公眾號 霸道的程式猿 獲取編 ...
  • 1.分析所有表 select 'analyze table '||table_name||' compute statistics;' from user_tables; copy出來執行。。。。更新user_tables的num_rows 2. select * FROM user_tables ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...