mysql事務的詳細說明

2021-09-27 07:16:26 字數 1489 閱讀 4314

事務由一組操作構成,我們希望這組操作能夠全部正確執行,如果這一組操作中的任意乙個步驟發生錯誤,那麼就需要回滾之前已經完成的操作。也就是同乙個事務中的所有操作,要麼全都正確執行,要麼全都不要執行。

說到事務,就不得不提一下事務著名的四大特性。

注意:事務只能保證資料庫的高可靠性,即資料庫本身發生問題後,事務提交後的資料仍然能恢復;而如果不是資料庫本身的故障,如硬碟損壞了,那麼事務提交的資料可能就丟失了。這屬於『高可用性』的範疇。因此,事務只能保證資料庫的『高可靠性』,而『高可用性』需要整個系統共同配合實現。

在事務的四大特性acid中,要求的隔離性是一種嚴格意義上的隔離,也就是多個事務是序列執行的,彼此之間不會受到任何干擾。這確實能夠完全保證資料的安全性,但在實際業務系統中,這種方式效能不高。因此,資料庫定義了四種隔離級別,隔離級別和資料庫的效能是呈反比的,隔離級別越低,資料庫效能越高,而隔離級別越高,資料庫效能越差。

我們先來看一下在不同的隔離級別下,資料庫可能會出現的問題:

更新丟失 當有兩個併發執行的事務,更新同一行資料,那麼有可能乙個事務會把另乙個事務的更新覆蓋掉。 當資料庫沒有加任何鎖操作的情況下會發生。

髒讀 乙個事務讀到另乙個尚未提交的事務中的資料。 該資料可能會被回滾從而失效。 如果第乙個事務拿著失效的資料去處理那就發生錯誤了。

不可重複讀 不可重複度的含義:乙個事務對同一行資料讀了兩次,卻得到了不同的結果。它具體分為如下兩種情況:

不可重複讀 與 髒讀 的區別? 髒讀讀到的是尚未提交的資料,而不可重複讀讀到的是已經提交的資料,只不過在兩次讀的過程中資料被另乙個事務改過了。

資料庫一共有如下四種隔離級別:

read uncommitted 讀未提交 在該級別下,乙個事務對一行資料修改的過程中,不允許另乙個事務對該行資料進行修改,但允許另乙個事務對該行資料讀。 因此本級別下,不會出現更新丟失,但會出現髒讀、不可重複讀。

read committed 讀提交 在該級別下,未提交的寫事務不允許其他事務訪問該行,因此不會出現髒讀;但是讀取資料的事務允許其他事務的訪問該行資料,因此會出現不可重複讀的情況。

repeatable read 重複讀 在該級別下,讀事務禁止寫事務,但允許讀事務,因此不會出現同一事務兩次讀到不同的資料的情況(不可重複讀),且寫事務禁止其他一切事務。

serializable 序列化 該級別要求所有事務都必須序列執行,因此能避免一切因併發引起的問題,但效率很低。

隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed。它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

MySQL的explain詳細說明

explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的索引和寫出更優化的查詢語句。使用方法,在select語句前加上explain就可以了 如 explain select surname,first name form a,b where a.id b.id...

MySQL新建使用者詳細說明

create user username host identified by password create user dog localhost identified by 123456 create user pig 192.168.1.101 idendified by 123456 cre...

mysql 的各種檔案詳細說明

1 資料目錄 mysql show global variables like datadir variable name value datadir home mysqldata 1 row in set 0.00 sec innodb資料檔案。儲存innodb資料,索引,double write...