原子性指事務所包含的所有操作要麼全部成功,要麼全部失敗回滾。
一致性是指事務必須使資料庫從乙個一致性狀態改變到另外乙個一致性狀態,也就是說事務執行之前和執行之後都必須處於一致性狀態。
隔離性是當多個使用者併發訪問資料庫時,資料庫為每個使用者開啟的事務,不能被其他事務的操作所干擾,多個併發事務之間要互相隔離。
在事務完成後,該事務對資料庫所作的更改永久儲存在資料庫之中,並不會被回滾。
兩個事務都同時更新一行資料,但是第二個事務卻中途失敗退出,導致對資料的兩個修改都失效了。這是因為系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。
髒讀又稱無效資料讀出。乙個事務讀取另外乙個事務還沒有提交的資料叫髒讀。
例如:事務t1修改了一行資料,但是還沒有提交,這時候事務t2讀取了被事務t1修改後的資料,之後事務t1因為某種原因rollback了,那麼事務t2讀取的資料就是髒的。
不可重複讀是指在同乙個事務內,兩個相同的查詢返回了不同的結果。
例如:事務t1讀取某一資料,事務t2讀取並修改了該資料,t1為了對讀取值進行檢驗而再次讀取該資料,便得到了不同的結果。
事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的資料或者缺少了第一次查詢**現的資料
例如:系統管理員a將資料庫中所有學生的成績從具體分數改為abcde等級,但是系統管理員b就在這個時候插入了一條具體分數的記錄,當系統管理員a改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣。這就叫幻讀。
更新丟失、髒讀、不可重複讀、幻讀都和事務的隔離級別有關。通過設定事務的隔離級別,可以避免上述問題的發生。
也稱為讀未提交(read uncommitted)。
以操作同一行資料為前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他寫事務(但允許其他讀事務)。
此隔離級別可以防止更新丟失,但不能防止髒讀、不可重複讀、幻讀。
此隔離級別可以通過「排他寫鎖」實現。
也稱為讀提交(read committed)。
以操作同一行資料為前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他讀事務和寫事務。
此隔離級別可以防止更新丟失、髒讀,但不能防止不可重複讀、幻讀。
此隔離級別可以通過「瞬間共享讀鎖」和「排他寫鎖」實現。
可重複讀取(repeatable read)。
以操作同一行資料為前提,讀事務禁止其他寫事務(但允許其他讀事務),未提交的寫事務禁止其他讀事務和寫事務。
此隔離級別可以防止更新丟失、髒讀、不可重複讀,但不能防止幻讀。
此隔離級別可以通過「共享讀鎖」和「排他寫鎖」實現。
序列化(serializable)。
提供嚴格的事務隔離。它要求事務序列化執行,事務只能乙個接著乙個地執行,不能併發執行。
此隔離級別可以防止更新丟失、髒讀、不可重複讀、幻讀。
如果僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。
隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed。它能夠避免更新丟失、髒讀,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。
資料庫構建的一點總結
說實話,做這樣乙個迷你的資料的確沒什麼太大的實際價值,但是還是堅持下來了,隨著 drop index indexname on tablename sql語句的完成,這個爛尾樓似的資料庫也算乙個段落了。其間,經歷了select語句的繁瑣,尤其是多表連線和where的判斷,體驗了底層文 件構建的痛苦。...
防止資料庫注入的一點小總結
1.資料庫使用者不能用sa 新建乙個使用者單獨操作使用的資料庫 2取消 sysobjects columns 表的select許可權 3 過濾 4post get url過濾 code 過濾xss攻擊指令碼 傳入字串 過濾後的字串 public static string filterxss str...
Redis資料庫 簡單些一點入門筆記
redis 簡單些一點筆記 1 redis是乙個什麼東西哪?是乙個記憶體資料庫 2 redis有什麼特點哪?具有記憶體的特點 快 斷電即逝 具有資料的特點 主要用來儲存資料,可以進行對資料的增刪改查 3 我們用redis主要是為什麼哪?畢竟有好多種其他的資料庫了?我們使用這個東西,核心目標就是為了快...