數據庫的事務級別介紹與操作

?關系型數據庫都具有一套事務級別,以前的開發和學習過程我很少關注過這個概念,今天搜集了一些資料,在

結合spring聲明式事務學習的同時,總結一下數據庫的事務級別與操作。

READ-UNCOMMITTED: 未提交讀 會出現臟讀、不可重復讀、幻讀 ( 隔離級別最低,并發性能高 )

READ-COMMITTED: 提交讀 會出現不可重復讀、幻讀問題(鎖定正在讀取的行)

REPEATABLE-READ: 可重復讀 會出幻讀(鎖定所讀取的所有行)

SERIALIZABLE: 序列化 保證所有的情況不會發生(鎖表)

詳細說明:

未提交讀——這通常稱為 'dirty read':non-locking SELECT 的執行使我們不會看到一個記錄的可能更早的版本;
因而在這個隔離級別下是非 'consistent' reads;這級隔離級別的運作如同 READ COMMITTED。處于這個隔離級的
事務可以讀到其他事務還沒有提交的數據。如果這個事務使用其他事務未提交的變化作為計算的基礎,然后那些未
提交的變化被他們的父事務撤銷,則會導致誤差。

提交讀——在一個事務中已經COMMIT的數據可以在其他事務中看到。如果這個事務頻繁提交的話,其他的大的查詢
事務中可能會得到多個不同的結果。

可重復讀——這是 InnoDB 默認的事務隔離級。在一個事務中所有讀都是連續的。

序列化——提供最大程度的隔離,如果每個事務都以這種隔離級運行就會影響Mysql的性能,因為需要大量的資源來
使大量事務在任一時刻不被看到。如果一個事務在執行一個SELECT操作,另外的事務不允許執行UPDATE操作,這個
隔離級別下的SELECT操作被陰式地轉換為 SELECT ... LOCK IN SHARE MODE。

不可重復讀的重點是修改 :?
同樣的條件 ,?? 你讀取過的數據 ,?? 再次讀取出來發現值不一樣了?
幻讀的重點在于新增或者刪除?
同樣的條件 ,?? 第 1 次和第 2 次讀出來的記錄數不一樣


MySQL InnoDB存儲引擎的事務隔離級別

查看InnoDB系統級別的事務隔離級別:

以下為引用的內容:?
mysql> SELECT @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ   |
+-----------------------+
1 row in set (0.00 sec)
?


查看InnoDB會話級別的事務隔離級別:

以下為引用的內容:?
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
?


修改事務隔離級別:

以下為引用的內容:?
mysql> set global transaction isolation level read committed;

  Query OK, 0 rows affected (0.00 sec)

  mysql> set session transaction isolation level read committed;

  Query OK, 0 rows affected (0.00 sec)
?


InnoDB的可重復讀隔離級別和其他數據庫的可重復讀是有區別的,不會造成幻象讀(phantom read),所謂幻象讀,

就是同一個事務內,多次select,可以讀取到其他session insert并已經commit的數據。下面是一個小的測試,證明

InnoDB的可重復讀隔離級別不會造成幻象讀。測試涉及兩個session,分別為session 1和session 2,隔離級別都是

repeateable read,關閉autocommit


以下為引用的內容:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

  mysql> set autocommit=off;

  Query OK, 0 rows affected (0.00 sec)

  session 1 創建表并插入測試數據

  mysql> create table test(i int) engine=innodb;

  Query OK, 0 rows affected (0.00 sec)

  mysql> insert into test values(1);

  Query OK, 1 row affected (0.00 sec)

  session 2 查詢,沒有數據,正常,session1沒有提交,不允許臟讀

  mysql> select * from test;

  Empty set (0.00 sec)

  session 1 提交事務

  mysql> commit;

  Query OK, 0 rows affected (0.00 sec)

  session 2 查詢,還是沒有數據,沒有產生幻象讀

  mysql> select * from test;

  Empty set (0.00 sec)

以上試驗版本:

mysql> select version();
+-------------------------+c
| version()       |
+-------------------------+
| 5.0.37-community-nt-log |
+-------------------------+
1 row in set (0.00 sec)

?

spring的聲明式事務的隔離級別與數據庫的如出一轍,共5種級別:

1.?ISOLATION_DEFAULT: 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.
????? 另外四個與JDBC的隔離級別相對應
?2.?ISOLATION_READ_UNCOMMITTED: 這是事務最低的隔離級別,它充許令外一個事務可以看到這個事務未提交的數據。
????? 這種隔離級別會產生臟讀,不可重復讀和幻像讀。
?3.?ISOLATION_READ_COMMITTED: 保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據
?4.?ISOLATION_REPEATABLE_READ: 這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。
????? 它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。
?5.?ISOLATION_SERIALIZABLE?這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。
????? 除了防止臟讀,不可重復讀外,還避免了幻像讀。 ?


本文轉自施楊博客園博客,原文鏈接:http://www.cnblogs.com/shiyangxt/archive/2009/02/11/1388519.html,如需轉載請自行聯系原作者???

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257016.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257016.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257016.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中國做圖像處理的公司

(1) 北京北方獵波科技有限公司:http://www.northwh.com/beifangliebo/main1.html 紅外探測成像產品 (2) 深圳超多維光電子有限公司北京分公司:http://www.superd.com.cn 立體顯示設備 (3&…

[ilink32 Error] Error: Unresolved external 'SendARP'

[ilink32 Error] Error: Unresolved external SendARP referenced from E:\APPOBJ\KSRGETMAC.OBJ #pragma link "iphlpapi.lib" 轉載于:https://www.cnblogs.com/cb168/p/5573478.html

3.cocos2dx它Menu,由menu為了實現場景切換

1 頭文件 TMenu.h #ifndef __TMENU_H__ #define __TMENU_H__ #include "cocos2d.h" USING_NS_CC; class TMenu :public CCLayer { public: static CCScene * scene(); CREATE_FUNC(TMenu); bool init(); CCMenu * menu; void menuCallback(C…

Difference: throw or throw ex?

Difference: throw or throw ex? 主要區別在于throw出的堆棧詳細程度。 throw ex只是拋出在當前代碼處的錯誤。 throw 能夠更進一步,拋出內部調用的具體錯誤。 Just for demonstrating, if you have classes in C# as follows: using System;namespace WindowsAppl…

學習筆記01:1.1 基于概率的信任

基于概率的信任 大數定律:當樣本數量越來越多時,預測事件也就越來越接近于真實的事件,事件出現的頻率無窮地接近事件發生的概率建模檢驗:人工規則->學習模型,數據少則重視先驗,數據多則重視后驗給予概率…

人工智能數學基礎知識

方差的概念與計算公式,例1 兩人的5次測驗成績如下:X: 50,100,100,60,50 E(X)72;Y: 73, 70, 75,72,70 E(Y)72。平均成績相同…

學習筆記02:直播串講——3/22

去 就 就 就 接近 就 就 接近

認真分析mmap:是什么 為什么 怎么用

mmap基礎概念 mmap是一種內存映射文件的方法,即將一個文件或者其它對象映射到進程的地址空間,實現文件磁盤地址和進程虛擬地址空間中一段虛擬地址的一一對映關系。實現這樣的映射關系后,進程就可以采用指針的方式讀寫操作這一段內存&#xff…

數據庫子查詢

子查詢,又叫做嵌套查詢。 將一個查詢語句做為一個結果集供其他SQL語句使用,就像使用普通的表一樣,被當作結果集的查詢語句被稱為子查詢。 子查詢有兩種類型: 一種是只返回一個單值的子查詢,這時它可以用在一個單值可以…

攝像頭資料

https://blog.csdn.net/u013749068/article/details/79463736

配置vim在源代碼中自動添加作者信息

每個程序員都有自己心愛的代碼編輯和查看工具,相信不少Linux下的程序員都喜歡用Vim,盡管Vim沒有SourceInsight這種依托于桌面環境的編輯器看起來那樣強大,但是Vim的高效、簡潔以及強大的可配置性都讓它吸引了無數忠實的fans。 很多編輯器都支…

paddle模塊的詳細介紹

https://blog.csdn.net/hua111hua/article/details/89415396

[CareerCup] 2.4 Partition List 劃分鏈表

2.4 Write code to partition a linked list around a value x, such that all nodes less than x come before all nodes greater than or equal to x. LeetCode上的原題,請參見我之前的博客Partition List 劃分鏈表。轉載于:https://www.cnblogs.com/grandyang/p/…

sdl的縮放問題

SDL是一種既是開源的,也是跨平臺的多媒體開發包,在各種平臺上應用很廣,經常和FFMPEG等解碼器同時使用。對于在windows mobile等缺乏通用播放器的平臺來說,是一種很好的選擇。網上很多代碼,介紹SDL的用法,主…

Ubuntu系統盤制作

1、首先打開UltraISO軟件,盡量下載最新版的,小編曾用某個舊版的UltraISO,制作的安裝盤,不能不能識別磁盤,安裝失敗! 2、點擊工具欄中的第二個打開鏡像文件工具,如圖紅色方框標志按鈕,然后在打開…

RH131 網絡配置

ip addr show 查看當前網絡地址 ip link show 查看網絡鏈接狀態 ip -s link show 查看網卡統計信息 ip addr add 192.168.0.154 添加ip地址 ip link dev eth0 down 禁用ip地址 網卡的配置文件/etc/sysconfig/network-scripts/ifcfg-ethx 自動專用地址:169.254.*.* …

學習筆記02:直播串講02

1.基于模型的學習 根據以往的學習經驗,建立起輸入輸出的模型,然后預測輸入,并且將輸入帶入到模型中,進而預測出輸出的結果,這種學習稱為基于模型的學習 2.機器學習的過程 1)數據收集:通過爬蟲、…

如何將Pcm格式的音頻文件轉換成Wave格式的文件

最近在做一款變聲App,其中就用到了將pcm格式轉wave格式,下面貼出源代碼,希望帶有需求的童鞋有幫助!!!這里是c語言寫的,也可以用java實現。當然java調用native函數要用到jni技術。具體jni技術自己…

Dojo儀表板

Dojo它提供了一個良好的儀表板顯示器&#xff0c;的影響&#xff0c;如以下&#xff1a; <!DOCTYPE html> <html> <head><title>Dojo儀表盤</title><meta charset"utf-8"><script src"http://192.168.240.186/arcgis_js…