SQL資料庫中:該如何理解事務?

2020-12-17 小瑾web開發筆記

什麼是事務?

事務是一組原子性的sql查詢,或者說一個獨立的工作單元。如果資料庫引擎能夠成功地對資料庫應用該組查詢的全部語句,那麼就執行該組查詢。如果其中有任何一條語句因為系統崩潰或其他原因無法執行,那麼所有的語句都不會執行。也就是說事務內的語句,要麼全部執行成功,要麼全部執行失敗。

事務的特性

原子性(atomicity)一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,不可能只執行其中的一部分操作。

一致性(consistency)資料庫總是從一個一致性的狀態轉換到另外一個一致性的狀態。在前面的例子中,一致性確保了,即使在執行第三、四條語句之間時系統崩潰,帳戶中也不會損失100元,因為事務最終沒有提交,所以事務中所做的修改也不會保存到資料庫中。

隔離性(isolation)通常來說,一個事務所做的修改在最終提交以前,對其他事務是不可見的。在前面的例子中,當執行完第三條語句、第四條語句還未開始時,此時有另外一個帳戶匯總程序開始運行,則其看到的帳戶的餘額並沒有被減去100元。

持久性(durability)一旦事務提交,則其所做的修改就會永久保存到資料庫中。此時即使系統崩潰,修改的數據也不會丟失。

事務的隔離級別

在SQL標準中定義了四種隔離級別,較低級別的隔離通常可以執行更高的並發,系統的開銷也更低。

READ UNCOMMITTED(未提交讀)在READ UNCOMMITTED級別,事務的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的數據,這也被稱為髒讀(dirty read)。這個級別會導致很多問題,從性能上說,READ UNCOMMITTED不會比其他的級別好太多,但卻缺乏其他級別的很多好處,除非真的有非常必要的理由,在實際應用中一般很少使用。

READ COMMITTED(提交讀)大多數資料庫系統的默認隔離級別都是READ COMMITTED(mysql不是)。READ COMMITTED滿足前面提到的隔離性的簡單定義:一個事務開始時,只能看見已經提交的事務所做的修改。換句話說,一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。這個級別有時也叫做不可重複讀(nonrepeatable read),因為兩次執行同樣的查詢,可能會得到不一樣的結果。

REPEATABLE READ(可重複讀)REPEATABLE READ解決了髒讀的問題。該級別保證了在同一個事務中多次讀取同樣記錄的結果是一致的。但是理論上,可重複讀隔離級別還是無法解決另外一個幻讀(phantom read)的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行(phantom row)。Innodb和XtraDB存儲引擎通過多版本並發控制(MVCC,Multiversion Concurrency Control)解決了幻讀的問題。

REPEATABLE READ(可重複讀)是mysql默認的隔離級別。

SERIALIZABLE(可串行化)SERIALIZABLE是最高的隔離級別。它通過強制事務串行執行,避免了前面說的幻讀的問題。簡單的說,SERIALIZABLE會在讀取的每一行數據上都加鎖,所以可能導致大量的超時和鎖爭用的問題。實際應用中也很少用到這個隔離級別,只有在非常需要確保數據的一致性而且可以接受沒有並發的情況下,才考慮採用該級別。

SQL隔離級別(由低到高)

本文的一些內容為確保概念定義的準確性,參考《高性能MYSQL》第三版。

相關焦點

  • 面試被問:JDBC底層是如何連接資料庫的?|sql|mysql|數據源|java|...
    背景  前兩天一個小夥伴面試的時候,被問JDBC底層是如何連接資料庫的?  他頓時一臉懵逼,因為大部分人只知道JDBC的幾個步驟,至於底層到底是怎麼連接資料庫的,還真不知道。  由於小夥伴是面試高級開發,問這種問題倒也不能說面試官過分,如果是初級或者中級,那問著問題就確實有些過分了。
  • SQL 資料庫語句
    後接表明,附加需要完整的路徑名14.如何修改資料庫的名稱:sp_renamedb 'old_name', 'new_name'二、提升1、說明:複製表(只複製結構,源表名:a 新表名:b) (Access可用)法一:select * into b from a where 1<>1(僅用於SQlServer)
  • 如何使用 SQL Server FILESTREAM 存儲非結構化數據?
    這個概念的主要優點是資料庫中的集成管理和事務一致性。在這種情況下,安全問題(以前的文件解決方案)得到了解決。但仍存在一些問題,即2GB的限制以及日誌文件過載。為了解決這些問題,SQL Server 2008首次引入了名為FILESTREAM的增強功能。
  • Python零基礎入門教程,如何操作資料庫?
    修修心養養性天行健,君子以自強不息;地勢坤,君子以厚德載物大綱掌握資料庫連接對象Connection中重要方法掌握遊標對象Cursor中重要方法.connect('資料庫')# Connection對象下重要的方法# 獲取Cursor遊標對象conn.cursor()# 提交資料庫事務conn.commit()
  • 使用Spring框架實現資料庫事務處理
    企業級應用系統在更新資料庫數據時,一般都採用資料庫事務處理,以確保資料庫數據的一致性。本文主要討論在Spring框架中如何使用資料庫事務處理更新資料庫數據。通過本課的學習,可以達到如下目標。1、JDBC對資料庫事務處理的支持JDBC本身就提供了對資料庫事務處理的支持,使用java.sql.Connection對象完成事務的提交。使用Connection提交資料庫事務處理代碼如下。
  • MySQL資料庫SQL優化教程二
    摸清楚他是如何執行,有怎麼的解構,才能更好使用。今天的主要內容是SQL語言的組成,和SQL的解構,以及SQL是一那種方式去執行的。SQL 語言的組成,SQL可以創建。維護,保護資料庫對象。井且可以操作對象中的數據。因此SQL被認為是一種黨整的略言。
  • Rspec的資料庫事務:如何清理陳舊數據?
    圖源:devclass測試用例之間的陳舊數據是RSpec中競態條件的主要原因之一,包括資料庫Redis、文件等。本文就將討論如何清理資料庫中的陳舊數據。如何讓「事務裝置」實現「在事務內運行每個示例」?在深入研究Rails 4代碼庫,了解了它在後臺的實際工作之後,我發現了以下內容。setup_fixtures函數中,Rails為每個資料庫連接調用begin_transaction。
  • sql替換資料庫欄位中的字符
    某些時候我們要修改資料庫欄位中的部分字符串,如果內容少時一個一個替換,內容多時,就不能一個一個的替換了,因為這樣不僅耗時還容易出錯。下面就用sql批量進行替換。替換shopping_hw表中欄位hw_pic,內容「*common」替換為「+play」.
  • 考前複習必備MySQL資料庫(關係型資料庫管理系統)
    語法格式如下:create database [db_name];創建一個名為web的資料庫:在資料庫創建好後,mysql的data目錄下會自動生成一個名為web的目錄,該資料庫的數據會存儲於該目錄下。在mysql中可以支持運行多個資料庫,所以我們可以創建多個資料庫。
  • JAVA常見資料庫操作API
    對象,即將SQL語句提交到資料庫進行預編譯    CallableStatement prepareCall(String sql) throws SQLException;        //該方法返回CallableStatement對象,該對象用於調用存儲過程    // 控制事務的相關方法    Savepoint setSavepoint() throws SQLException
  • Java資料庫連接性簡介
    本文提供了JDBC的概述,然後是使用JDBC API將Java客戶端與輕量級關係資料庫SQLite連接的動手入門。JDBC如何工作JDBC作為基於C的ODBC(開放資料庫連接)API的替代產品而開發,提供了編程級別的接口,該接口處理Java應用程式與資料庫或RDBMS通信的機制。
  • 資料庫之SQL查詢語句
    所有資料庫都使用相同或者相似的語言。(1) 數據定義語言(DDL ): Data Definition Language用於建立、修改、刪除資料庫對象。資料庫對象包括:表、視圖、索引、序列。包括:CREATE :創建表或其他對象的結構ALTER :修改表或其他對象的結構DROP:刪除表或其他對象的結構TRUNCATE:刪除表數據,保留表結構(2) 數據操縱語言(DML):Data Manipulation Language用於改變數據表中的數據。
  • 一文讀懂如何解決MySQL資料庫超時配置問題
    打開APP 一文讀懂如何解決MySQL資料庫超時配置問題 發表於 2017-10-25 16:28:27 在過程中我們發現在MySQL資料庫中出翔了許多的超時的配置,那麼它有哪些超時配置,它會有什麼影響嗎?今天的文章就讓我來大家來分析一下。   1.
  • MySQL sql_mode 說明(及處理一起 sql_mode 引發的問題)
    SQL語法支持類ONLY_FULL_GROUP_BY對於GROUP BY聚合操作,如果在SELECT中的列、HAVING或者ORDER BY子句的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的。是可以理解的,因為不在 group by 的列查出來展示會有矛盾。
  • 如何使用 Spring 對資料庫進行 CURD?
    作者 | 阿文,責編 | 郭芮頭圖 | CSDN 下載自視覺中國作為一名程式設計師,CURD(增刪改查)是一件必不可少的事情,甭管你是初級程式設計師還是高級程式設計師都會和資料庫打交道。那麼在Java中如何通過Spring 框架來對資料庫進行操作呢?本文將帶你一起來學習。
  • 資料庫常用的sql語句匯總(2)
    資料庫相關查所有資料庫 show databases;創建資料庫 create database db1;查看資料庫show create database db1;創建資料庫指定字符集 create database db1 character set utf8/gbk刪除資料庫 drop database db1;使用資料庫 use db1;
  • Access中查詢SQL資料庫中文字符的問題處理
    用access連結sql server中的表,建立選擇查詢時,無法查找中文數據,在這裡採用了傳遞查詢來解決這個問題。
  • SQL資料庫常見故障及解決方法
    SQL資料庫被廣泛運用於中小型企業,作為數據存儲的倉庫。但是由於一些故障原因,會造成sql資料庫損壞,數據丟失。
  • 使用Python操作SQL Server資料庫
    可以使用這條命令:select name from sysobjects where xtype='u'SQL Server中各個系統表的作用sysaltfiles 僅在主資料庫 保存資料庫的文件syscharsets 僅在主資料庫 字符集與排序順序sysconfigures 僅在主資料庫
  • SQL Server的怪闢:異常與孤立事務
    一、首先從SQLServer中Error講起,SQL中錯誤處理有些怪闢 錯誤級別同是16但結果都不同。 '這個沒有輸出'  go  raiserror('',16,3)  if @@error<>0  print '這個輸出了'  go  exec('select * from 一個不在的表')  if @@error<>0  print '這個輸出了'  go  exec sp_executesql