mysql 設定唯讀事務 Spring 唯讀事務

2021-10-18 10:22:39 字數 958 閱讀 1674

@transactional(readonly = true)這東西不叫唯讀事務,它只是建立了乙個唯讀的資料庫連線。

transactional裡面還有個引數,叫isolation這個才是控制隔離級別的。

spring提供了5種事務隔離級別予以解決:

1、default預設級別

default為資料來源(資料庫)的預設隔離級別,以目前常用的mysql為例,預設的隔離級別通常為repeatable_read。

2、read_uncommitted未授權讀取級別

這是最低的隔離級別,乙個事務能讀取到別的事務未提交的更新資料,很不安全,可能出現丟失更新、髒讀、不可重複讀、幻讀。

3、read_committed授權讀取級別

以操作同一行資料為前提,讀事務允許其他讀事務和寫事務,未提交的寫事務禁止其他讀事務和寫事務。此隔離級別可以防止更新丟失、髒讀,但不能防止不可重複讀、幻讀。此隔離級別可以通過「瞬間共享讀鎖」和「排他寫鎖」實現。

4、repeatable_read可重複讀取級別

保證同一事務中先後執行的多次查詢將返回同一結果,不受其他事務影響。以操作同一行資料為前提,讀事務禁止其他寫事務,但允許其他讀事務,未提交的寫事務禁止其他讀事務和寫事務。此隔離級別可以防止更新丟失、髒讀、不可重複讀,但不能防止幻讀。

5、serializable序列化級別

所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾。提供嚴格的事務隔離,此隔離級別可以防止更新丟失、髒讀、不可重複讀、幻讀。如果僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。

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

事務 唯讀事務

b 沒有事務 b 保證了sql語句級別的讀一致性。即在一條sql語句執行期間,它只會看到執行前點的資料狀態,而不會看到執行期間資料被其他sql改變的狀態。存在的問題 比如你做乙個報表查詢,在執行完第一條sql的時候,執行第二條查詢sql,而這個之間有資料被改變了,第二條資料查詢就有可能不一致 b 唯...

oracle唯讀事務

一致性讀是oracle區別於其他資料庫的重要特點之一,但一般來說,這個一致性讀是sql級別的,只針對單個sql有效。由於業務邏輯需要,我們可能需要在乙個事務中的多個sql也能實現讀一致性,也就是說,資料來源在事務開始時就定下來了,不受其他會話影響。oracle的唯讀事務可以實現這個功能,它可以在事務...

唯讀事務和沒有事務

在專案中看到 transactional readonly true 註解 該屬性用於設定當前事務是否為唯讀事務,設定為 true 表示唯讀,false 則表示可讀寫,預設值為 false 例如 transactional readonly true 了解到是唯讀事務,網上搜了下唯讀事務和沒有事務的...