事務基本定義操作
一、什麼是事務
一個事務是由一條或者多條sql語句組成的不可分割的單元,只有當事務中的所有操作都正常執行完了,整個事務才會被提交給資料庫; 如果有部分事務失敗,那麼事務就要回退到最初的狀態,或者回退到事務操作的任何一個狀態,因此,事務要麼全部成功,要麼全部失敗。
當程式出錯的時候可以通過rollback回到最初的狀態。當確定所有sql語句沒有問題的時候可以執行commit提交,這一步操作回對資料庫造成永續性的影響。
注1:單獨一個sql語句並不能判斷是事務,判斷事務的標準必須可以執行rollback操作或者commit操作。
注2:rollback可以進行設定儲存點,savepoint point1,rollback to point1。操作就是回退到point1所在的位置。
二、事務的特性
事務的特性分為A C I D
- 事務的原子性(Atomic):事務是一個不可分割的整體,事務必須有原子性,要麼全部執行,要麼全部不執行。
- 事務的一致性(Consistency):一個事務執行之前和執行之後,資料庫必須保持一致性的狀態。資料庫的一致性狀態必由使用者來負責
,並由 併發控制機制實現。併發資料帶來的資料不一致包括(髒資料、不可重複讀、幻讀)。打個比方:狂徒張三給隔壁老王轉1萬塊錢,但是還沒提交,然後隔壁老王呢,正好在查銀行餘額,發現多了1萬塊,之後狂徒張三突然覺的,爺憑本事借的錢憑啥還你,於是rollback操作一波,隔壁老王發現1萬不翼而飛,**隔壁。 - 事務的隔離性(Isolation):當兩個或者多個事務併發執行時,為了保持資料的安全性,將一個事務內部的操作與其他事務的操作隔離起來,不被其他正在執行的事務所看到。 分為四種級別。
- 事務的永續性(Durablity):事務完成後,DBMS保證它對資料庫中的資料的修改是永久性的 。即使資料庫因為故障出錯,也應該能夠恢復資料。
三、事務的操作
- 設定隔離級別
- 開啟事務
- begin
- 書寫組成事務的sql語句
- 如果事務執行過程中由bug rollback/rollback to 。如果mm欸有bug,就commit!
檢視mysql是否已經關閉自動提交。
1表示沒有關閉 0 表示已經關閉。
查詢事務的隔離級別
select @@tx_isolation
四、事物的隔離
多個事物同時操作可能會產生的問題:髒讀、不可重複讀、虛度。
髒讀(Dirty Read):一個事務讀取了另一個事物未提交的資料。
不可重複讀(NonRepeatable Read):一個事物的操作導致另一個事物前後兩次讀取到不同的資料。
虛讀(PhantomRead):一個事物的操作導致另一個事物前後兩次查詢的結果資料量不同。
不同的隔離級別解決不同的問題。
隔離級別 髒讀 不可重複讀 幻讀
未提交讀 可以 可以 可以
已提交讀 不可以 可以 可以
可重複讀 不可以 不可以 可以
序列化 不可以 不可以 不可以 效率最低
設定隔離級別:
- TRANSACTION_NONE。 表示不支援事務
- TRANSACTION_READ_UNCOMMITTED。未提交讀。
說明在提交前一個事務可以看到另一個事務的變化。這樣讀”髒”資料,不可重複讀和虛讀都是被允許的。 - TRANSACTION_READ_COMMITTED。已提交讀。
說明讀取未提交的資料是不允許的。這個級別仍然允許不可重複讀和虛讀產生。 - TRANSACTION_REPEATABLE_READ。可重複讀。
說明事務保證能夠再次讀取相同的資料而不會失敗,但虛讀仍然會出現。 - TRANSACTION_SERIALIZABLE。可序列化/序列化。
是最高的事務級別,它防止讀髒資料,不可重複讀和虛讀。
set session transaction isolation level Read uncommitted;
相關文章
- MySQL 事務操作MySql
- Redis事務操作Redis
- Mysql資料庫自定義函式的定義、使用方法及操作注意事項MySql資料庫函式
- 樹的定義 基本術語
- 定義製造業操作(定義 MES/MOM 系統)
- 事務處理基本概念
- Spring事務專題(三)事務的基本概念,Mysql事務處理原理SpringMySql
- Go 語言操作 MySQL 之 事務操作GoMySql
- Git分支的定義和操作Git
- 定時任務操作
- 超融合基本架構簡單定義架構
- google guava中定義的String操作GoGuava
- 103-字串的定義和操作字串
- 微服務之BOM定義微服務
- 函式基本定義和使用‘未完待續函式
- Python騷操作:動態定義函式Python函式
- 一個事務插入,另外一個事務更新操作,是否會更新成功?
- @Scheduled 定時任務自定義
- 使用 TypeScript 定義業務字典TypeScript
- sqlserver遇到回滾事務的操作策略SQLServer
- 基於Laravel框架定時任務相關實現方法及操作注意事項Laravel框架
- 不懂OT的列表定義操作的規則
- Spring之定時任務基本使用篇Spring
- Python命令列引數定義及注意事項Python命令列
- 如何定義API業務模型? - henriqAPI模型
- 關於流資料上的事務操作
- 主從分離的事務操作很容易發生誤操作
- 定時任務裡面事務不生效問題
- MongoDB基本操作MongoDB
- webpack 基本操作Web
- mongo基本操作Go
- SQL基本操作SQL
- ElasticSearch - 基本操作Elasticsearch
- candance 基本操作
- svn基本操作
- oracle基本操作Oracle
- Hash基本操作
- python基本操作Python