在回答這個問題的時候首先要考慮的是這裡面包含了哪些知識點是我們要回答的,
第乙個要點:什麼是事務;
第二個要點:資料庫的基本特性是什麼?
第三個要點:什麼是事務隔離,有哪些事務隔離級別?
什麼是事務
資料庫中的事務是作為單個邏輯工作單元執行的一系列操作。(多條 sql 語句,要麼全部執行成功,要麼全部執行失敗。)
資料庫要支援事務操作必須滿足四個特性,也就是常說的acid:
a:原子性(atomicity):原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗
c:一致性(consistency):乙個事務執行之前和執行之後都必須處於一致性狀態。
i:隔離性(isolation):多個事務在執行同乙個操作時不能被其他事務干擾。
d:永續性(dependency):乙個事務一旦提交,它對資料庫中資料的改變就應該是永久性的
什麼是事務隔離,有哪些事務隔離級別?
事務的隔離性就是指,多個併發的事務同時訪問乙個資料庫時,乙個事務不應該被另乙個事務所干擾,每個併發的事務間要相互進行隔離。
一般的資料庫,都包括以下四種隔離級別:
讀未提交(read uncommitted)
讀提交(read committed)
可重複讀(repeated read)
序列化(serializable)
讀未提交(read uncommitted)
讀未提交,就是可以讀到未提交的內容。
因此,在這種隔離級別下,查詢是不會加鎖的,也由於查詢的不加鎖,所以這種隔離級別的一致性是最差的,可能會產生「髒讀」、「不可重複讀」、「幻讀」。
讀提交(read committed)
讀提交,就是讀到已經提交了的內容。
這是各種系統中最常用的一種隔離級別,也是sql server和oracle的預設隔離級別。這種隔離級別能夠有效的避免髒讀,但除非在查詢中顯示的加鎖。「讀提交」只能避免「髒讀」,並不能避免「不可重複讀」和「幻讀」。
可重複讀(repeated read)
可重複讀,就是專門針對「不可重複讀」這種問題而制定的隔離級別,它可以有效的避免「不可重複讀」。並且它也是mysql的預設隔離級別。
當事務啟動時,不允許進行「修改操作(update)」,而「不可重複讀」恰恰是因為兩次讀取之間進行了資料的修改,因此,「可重複讀」能夠有效的避免「不可重複讀」,但卻避免不了「幻讀」,因為幻讀是由於「插入或者刪除操作(insert or delete)」而產生的。
序列化(serializable)
資料庫最高的隔離級別,這種級別下,事務「序列化順序執行」,也就是乙個乙個排隊執行(每一行資料都進行了加鎖)。
這種級別下,「髒讀」、「不可重複讀」、「幻讀」都不會出現,但是執行效率非常差,效能開銷也最大,所以基本沒人會用。
oracle 對資料庫事務的理解
事務控制命令只與dml命令 insert update delete配合使用,比如我們不會在建立表之後使用commit語句,因為當表被建立後,它會自動被提交給資料庫。也不能使用rollback語句來恢復被撤銷的表。此外,還有其他類似的語句,也不能被撤銷,例如truncate語句。所以,在執行新的命令...
面試題 說說你理解的介面卡模式?
前語 不要為了讀文章而讀文章,一定要帶著問題來讀文章,勤思考 面試題 說說你理解的介面卡模式?在以前學習介面卡模式時,有個經典例子 就是有些電器的工作電壓不是220v,比如電腦工作電壓20v,但是我們家庭用電的電壓是220。怎麼讓20v的電腦在220v的電壓下工作,這就需要乙個電源介面卡 俗稱充電器...
面試題 資料庫
今天面試,遇到資料庫方面的問題,由於好久沒接觸過,很多都忘記了,回來查了資料,整理一下 1 觸發器與儲存過程的區別 觸發器 是一種特殊型別的儲存過程,當使用下面的一種或多種資料修改操作在指定表中對資料進行修改時,觸發器會生效 update insert 或 delete。觸發器可以查詢其它表,而且可...