日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL 中事务详解

發布時間:2024/4/14 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL 中事务详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、事務的概念

2、在MySQL中哪些存儲引擎(表類型)支持事務哪些不支持

3、事務的四個屬性

4、mysql事務的創建與存在周期

5、mysql行為

6、事務的孤立性和性能

7、mysql的偽事務

一、事務的概念

?? 事務由單獨單元的一個或多個SQL語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元作為一個不可分割的整體,如果單元中某條SQL語句一旦執行失敗或產生錯誤,整個單元將會回滾。所有受到影響的數據將返回到事物開始以前的狀態;如果單元中的所有SQL語句均執行成功,則事物被順利執行。


二、MySQL 中的存儲引擎以及支持事務,和不支持事務的存儲引擎?

? 1、存儲引擎的概念:在mysql中的數據用各種不同的技術存儲在文件(或內存)中。

這些技術中的每一種技術都使用不同的存儲機制,索引 技巧,并且最終提供廣泛的不同的功能和能力。可以通過選擇不同的技術,可以獲得額外的速度或功能,從而改善應用的整體功能。

? 2、這些不同的技術以及配套的相關功能在mysql中被稱為存儲引擎(也稱為表類型)。

? 3、通過show engines;來查看mysql支持的存儲引擎。

?4、 在mysql中用的最多的存儲引擎有:innodb,bdb,myisam ,memory 等。其中innodb和bdb支持事務而myisam等不支持事務。

三、事務的四個屬性:

?1、原子性:事務是由一個或一組相互關聯的SQL語句組成,這些語句被認為是一個不可分割的單元。

?2、一致性:對于數據庫的修改是一致的,即多個用戶查的的數據是一樣的。一致性主要由mysql的日志機制處理,他記錄數據的變化,為事務恢復提供跟蹤記錄。

?3、隔離性(孤立性):每個事務都有自己的空間,和其他發生在系統中的事務隔離開來,而且事務的結果只在他完全被執行時才能看到

?4、持久性:但提交了這個事務之后對數據的修改更新就是永久的。當一個事務完成,數據庫的日志已經被更新時,持久性即可發揮其特有的 功效,在mysql中,如果系統崩潰或者數據存儲介質被破壞,通過日志,系統能夠恢復在重啟前進行的最后一次成功更新,可以反應系統崩潰時處于執行過程的事物的變化。

四、事務的創建及生存周期

對于支持事務的存儲引擎,一個事務的周期:


1、在創建事務的過程中,用戶需要創建一個innodb或bdb類型的數據表,其基本命令結構如下:

?create? table table_name? (file? defintions)? type=innodb/bdb;

2、對表類型進行修改

?alert? table table-name? type =innodb/bdb;

3、事務的整個過程

?use? databases;?? //使用某個數據庫

?start transaction ;?? //開始事務 、這里也可以使用 begin?? 、 beginwork

?insert? into stu1 values('',? );?? //進行相關的操作

?commit??? //提交事物

?rollback?? //撤銷事務(事務回滾)

五:mysql行為

?1、我們在使用mysql是如果關閉之后,打開在查詢的話就會發現,哪些數據已經保存了,但是我們知道,在這過程中沒有進行顯示或隱式提交,問什么會這樣那?因為我們在mysql中設置了自動提交,但我們也可以改為手動提交。

?2、 set?? autocommit =0;? //關閉自動提交

3、 set?? autocommit =1;? //開啟自動提交

六、事務的孤立性(隔離性)

1、在多用戶的時候使用孤立性級別是很重要的,這樣可以保證這些事務互不影響,保證數據庫性能不受到影響。

2、mysql中提供的孤立級別有以下四種:

?SQL標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的并發處理,并擁有更低的系統開銷。
Read Uncommitted(讀取未提交內容)

?????? 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之為臟讀(Dirty Read)。
Read Committed(讀取提交內容)

?????? 這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別 也支持所謂的不可重復讀(Nonrepeatable Read),因為同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果。
Repeatable Read(可重讀)

?????? 這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在并發讀取數據時,會看到同樣的數據行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。

Serializable(可串行化)?
?????? 這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

?????????這四種隔離級別采取不同的鎖類型來實現,若讀取的是同一個數據的話,就容易發生問題。例如:

???????? 臟讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由于某些原因,前一個RollBack了操作,則后一個事務所讀取的數據就會是不正確的。

?????????不可重復讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。

???????? 幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。

???????? 在MySQL中,實現了這四種隔離級別,分別有可能產生問題如下所示:

3、事務孤立級的查看和修改:?

查看:select @@tx_isolation;

修改:set? global? transaction? isolation level? 設置的孤立級別;

七、偽事務(鎖定)

1、在MySQL中根據不同的需求,提供了很多存儲引擎,但是有的存儲引擎不支持事務,對于這種情況,可以使用表鎖定來代替事務。

2、對于不支持事務的存儲引擎MYISAM類型數據表,當用戶插入,修改,刪除時,這些操作都會立即保存到磁盤中,當多用戶同時操作某個表時,可以使用表鎖定來避免同一時間有多個用戶對數據庫中指定表進行操作,這樣可以避免在用戶操作數據表過程中受到干擾。只有但用戶釋放表的操作鎖定后,其他 用戶才可以訪問這些修改的數據表。

這里的鎖和Java多線程中鎖的作用一樣,個人覺的可以這樣理解。

3、對指定表進行鎖操作的過程:

?(1)lock? table table-name lock type ;?? //locktype 有read 和write 兩種

對多個表進行加鎖:

?lock table? table-name1 lock type, table -name2? lock type ,table -name3 lock type;

(2)在指定的表中進行相應的操作

(3)當用戶完成對鎖定數據表的操作后,進行解鎖。

unlock tables ;? //釋放了所有加鎖表的鎖。

轉載于:https://blog.51cto.com/lookingdream/1905789

總結

以上是生活随笔為你收集整理的MySQL 中事务详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。