欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL數(shù)據(jù)庫事務原理及應用

 更新時間:2023年04月27日 10:18:41   作者:ZIYE_190  
MySQL數(shù)據(jù)庫事務是指一組數(shù)據(jù)庫操作,要么全部執(zhí)行成功,要么全部回滾。事務可以確保數(shù)據(jù)的一致性和完整性,避免了多個用戶同時對同一數(shù)據(jù)進行修改所帶來的問題。MySQL通過事務日志記錄事務的操作,支持事務的回滾和提交等操作

1 事務的使用

1.1 事務概念

事務就是一組DML語句組成,這些語句在邏輯上存在相關(guān)性,這一組DML語句要么全部成功,要么全部失敗,是一個整體。MySQL提供一種機制,保證我們達到這樣的效果。事務還規(guī)定不同的客戶端看到的數(shù)據(jù)是不相同的。

事務就是要做的或所做的事情,主要用于處理操作量大,復雜度高的數(shù)據(jù)。假設一種場景:你畢業(yè)了,學校的教務系統(tǒng)后臺 MySQL 中,不在需要你的數(shù)據(jù),要刪除你的所有信息(一般不會:) ), 那么要刪除你的基本信息(姓名,電話,籍貫等)的同時,也刪除和你有關(guān)的其他信息,比如:你的各科成績,你在校表現(xiàn),甚至你在論壇發(fā)過的文章等。這樣,就需要多條 MySQL 語句構(gòu)成,那么所有這些操作合起來,就構(gòu)成了一個事務。

正如我們上面所說,一個 MySQL 數(shù)據(jù)庫,可不止你一個事務在運行,同一時刻,甚至有大量的請求被包裝成事務,在向 MySQL 服務器發(fā)起事務處理請求。而每條事務至少一條 SQL ,最多很多 SQL ,這樣如果大家都訪問同樣的表數(shù)據(jù),在不加保護的情況,就絕對會出現(xiàn)問題。甚至,因為事務由多條 SQL 構(gòu)成,那么,也會存在執(zhí)行到一半出錯或者不想再執(zhí)行的情況,那么已經(jīng)執(zhí)行的怎么辦呢?

所以,一個完整的事務,絕對不是簡單的 sql 集合,還需要滿足如下四個屬性:

  • 原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務開始前的狀態(tài),就像這個事務從來沒有執(zhí)行過一樣。
  • 一致性:在事務開始之前和事務結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預定的工作。
  • 隔離性:數(shù)據(jù)庫允許多個并發(fā)事務同時對其數(shù)據(jù)進行讀寫和修改的能力,隔離性可以防止多個事務并發(fā)執(zhí)行時由于交叉執(zhí)行而導致數(shù)據(jù)的不一致。事務隔離分為不同級別,包括讀未提交( Read uncommitted )、讀提交( read committed )、可重復讀( repeatable read )和串行化( Serializable )
  • 持久性:事務處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失

1.2 事務的提交

事務的提交方式常見的有兩種:

  • 自動提交
  • 手動提交

查看事務提交方式

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.41 sec)

用 SET 來改變 MySQL 的自動提交模式

mysql> SET AUTOCOMMIT=0; #SET AUTOCOMMIT=0 禁止自動提交
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)
mysql> SET AUTOCOMMIT=1; #SET AUTOCOMMIT=1 開啟自動提交
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)

1.3 事務的常見操作

開啟事務:start transaction;

執(zhí)行多條SQL語句

回滾或提交:rollback/commit;

說明:rollback即是全部失敗,commit即是全部成功

2 事務隔離

2.1 事務并發(fā)時出現(xiàn)的問題

臟讀(第一個事務修改數(shù)據(jù)但沒有提交,第二個事務就讀取,在第一個事務回滾后,第二個事務讀取的就是臟數(shù)據(jù))

不可重復讀(一個事務兩次讀取數(shù)據(jù),中間有另一個事務修改,第一個事務兩次讀取的數(shù)據(jù)就不同)

幻讀 一個事務兩次讀取,中間有另一個事務執(zhí)行了插入操作,造成第一個事務看到不同的結(jié)果

2.2 事務隔離級別

讀未提交(Read Uncommitted): 在該隔離級別,所有的事務都可以看到其他事務沒有提交的執(zhí)行結(jié)果。(實際生產(chǎn)中不可能使用這種隔離級別的),但是相當于沒有任何隔離性,也會有很多并發(fā)問題,如臟讀,幻讀,不可重復讀等,我們上面為了做實驗方便,用的就是這個隔離性。

讀提交(Read Committed) :該隔離級別是大多數(shù)數(shù)據(jù)庫的默認的隔離級別(不是 MySQL 默認的)。它滿足了隔離的簡單定義:一個事務只能看到其他的已經(jīng)提交的事務所做的改變。這種隔離級別會引起不可重復讀,即一個事務執(zhí)行時,如果多次 select, 可能得到不同的結(jié)果。

可重復讀(Repeatable Read): 這是 MySQL 默認的隔離級別,它確保同一個事務,在執(zhí)行中,多次讀取操作數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行。但是會有幻讀問題。

串行化(Serializable): 這是事務的最高隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決了幻讀的問題。它在每個讀的數(shù)據(jù)行上面加上共享鎖。但是可能會導致超時和鎖競爭(這種隔離級別太極端,實際生產(chǎn)基本不使用)

隔離級別臟讀不可重復讀幻讀
讀未提交×××
讀提交××
可重復讀×
串行化

到此這篇關(guān)于MySQL數(shù)據(jù)庫事務原理及應用的文章就介紹到這了,更多相關(guān)MySQL數(shù)據(jù)庫事務內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL數(shù)據(jù)操作管理示例詳解

    MySQL數(shù)據(jù)操作管理示例詳解

    MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在WEB應用方面MySQL是最好的應用軟件之一。在本篇中,會讓大家快速掌握MySQL的基本操作,并輕松使用MySQL數(shù)據(jù)庫
    2022-09-09
  • MySQL中Like概念及用法講解

    MySQL中Like概念及用法講解

    在本篇文章里小編給大家整理的是一篇關(guān)于MySQL中Like概念及用法講解內(nèi)容,有興趣的朋友們可以學習參考下。
    2021-02-02
  • MySQL自增列插入0值的解決方案

    MySQL自增列插入0值的解決方案

    基于業(yè)務邏輯的要求,需要在MySQL的自增列插入0值,針對此需求,本文給予詳細的解決方案,感興趣的你可以參考下哈,希望可以幫助到你
    2013-03-03
  • mysql xtrabackup 備份恢復實現(xiàn)分享

    mysql xtrabackup 備份恢復實現(xiàn)分享

    Xtrabackup是由percona提供的mysql數(shù)據(jù)庫備份工具,據(jù)官方介紹,這也是世界上惟一一款開源的能夠?qū)nnodb和xtradb數(shù)據(jù)庫進行熱備的工具
    2012-11-11
  • MySQL數(shù)據(jù)庫學習之查詢操作詳解

    MySQL數(shù)據(jù)庫學習之查詢操作詳解

    這篇文章主要為大家詳細介紹一下MySQL數(shù)據(jù)庫中一些查詢操作,文中的示例代碼講解詳細,對我們學習MySQL有一定幫助,需要的可以參考一下
    2022-07-07
  • MYSQL如何查看進程和kill進程

    MYSQL如何查看進程和kill進程

    這篇文章主要介紹了MYSQL如何查看進程和kill進程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • MySQL約束與索引概念詳解

    MySQL約束與索引概念詳解

    約束是用來對數(shù)據(jù)業(yè)務規(guī)則和數(shù)據(jù)完整性進行實施、維護。約束的作用范圍僅限在當前數(shù)據(jù)庫,約束可以被當做數(shù)據(jù)庫對象來處理,它們具有名稱和關(guān)聯(lián)模式,是邏輯約束,不會因為設置約束而額外占用空間
    2023-04-04
  • mysql從執(zhí)行.sql文件時處理\n換行的問題

    mysql從執(zhí)行.sql文件時處理\n換行的問題

    后來注意到,在上面我們恢復數(shù)據(jù)的時候是在沒有連接數(shù)據(jù)的狀態(tài)下執(zhí)行的。
    2009-05-05
  • mybatis in語句不能大于1000的問題及解決

    mybatis in語句不能大于1000的問題及解決

    這篇文章主要介紹了mybatis in語句不能大于1000的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 教你為MySQL數(shù)據(jù)庫換擋加速

    教你為MySQL數(shù)據(jù)庫換擋加速

    如果你是個賽車手,并且按一下按鈕就能夠立即更換引擎而不需要把車開到車庫里去換,那會是什么感覺呢?MySQL數(shù)據(jù)庫為開發(fā)人員所做的就好像是按按鈕換引擎;它讓你選擇數(shù)據(jù)庫引擎,并給你一條簡單的途徑來切換它。
    2010-02-02

最新評論