如何理解spring事務及聲明式事務的使用
本篇文章帶給大家的內容是關於如何理解spring事務及聲明式事務的使用,包括數據庫中的事物隔離級別,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
spring事務及聲明式事務的使用
(同學們,開始複習大學還給老師的資料庫知識啦!!)
事務:存取並可能更新資料庫中各種資料項目的一個程式執行單元(unit)。
事務有四個屬性:(ACID)
原子性:一個事務是一個不可分割的工作單元,事務中包含的諸操作要么都做,要么都不做。
一致性;交易必須是使資料庫從一個一致性狀態變成另一個一致性狀態。一致性與原子性使密切相關的。
隔離性:一個交易的執行不能被其他事物幹擾。即一個事務內部操作及使用的資料對並發的其他事物是隔離的,並發執行的各個事務之間不能相互幹擾。
持久性:持久性也稱永久性,指一個交易一旦提交,它對資料庫中資料的改變就應該永久的。
交易目的:為了讓資料保持一致性和完整性。
一致性:一個業務鏈的資料狀態是一致的,不能部分改變部分不改變。
完整性:一個業務鏈的資料是完整的,要麼一起完成一起失敗,不能部分寫入成功,部分寫入失敗。
簡單理解事務的一致性和完整性就是要嘛一起活,要嘛一起死,不能獨活。 (像是淒慘的愛情……^ _ ^)
資料庫中的事物隔離等級
在了解事務隔離等級之前,先來了解資料中經常發生的可能導致業務邏輯失敗的幾種情況。
髒讀
當一個事務正在存取數據,並且對數據進行了修改,並且還沒有提交到資料庫中;這時另一個事務也訪問了這個數據,然後使用了這個數據。
例如:張三的銀行帳戶現在有1000,現在張三存入了200,那麼在張三點擊提交的時候,他媳婦(辛苦的張三在給媳婦存零用錢)在商場購物花了500。張三查看餘額發現只有500了(張三懵逼了。。)。然後兩人為了200吵了起來。以上就是脹讀引起一場家庭大戰。
無法重複讀取
無法重複讀取:一個交易內,多次讀同一個資料。在這個事務還沒結束時,另一個事務也存取了該資料。在第一個事務的兩次讀資料間,由於第二個事務的修改,第一事務兩次讀到的資料可能不一樣。這樣就發生了一個事務內兩次讀到的資料是不一樣的。 (即不能讀到相同的資料)
幻讀
一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行,同時第二個事務向表中插入一行新資料。就會發生操作第一個交易的使用者發現表中還有沒有修改的資料行。就好像發生了幻覺一樣。
spring的五種隔離級別
ISOLATION_DEFAULT
#表示底層資料庫的預設隔離級別,對大部分資料庫而言通常值是:ISOLATION _READ _COMMITTED
#ISOLATION _READ _UNCOMMITTED
表示一個交易可以讀取另一交易修改但還沒有提交的數據,不能防止髒讀和不可重複讀。
ISOLATION _READ _COMMITTED
一個交易只能讀取另一個交易已經提交的數據,可以防止髒讀,但是不能防止不可重複讀。 (大多數情況的建議值)
ISOLATION _REPEATABLE _READ
一個交易在整個過程中可以重複執行某個查詢,並且每次傳回的記錄都相同。即使在多次查詢之間有新增的資料滿足該查詢,這些新增的記錄也會被忽略。可防止髒讀和不可重複讀。
ISOLATION _SERIALIZBLE
所有交易依序逐一執行,這樣交易之間就完全不可能產生幹擾。可防止髒讀,不可重複讀,幻讀。
事務的傳播性(spring提供了七個)
是指事務之間的關係,例如一個事務中含有另一個事務,那麼傳播性用來確定相互的執行。
TransationDefinition.PROPAGETION.REQUIRED
如果目前存在事務,則加入該事務;如果目前沒有事務,則建立一個新的事務。
spring中的預設事務。適合絕大多數情況。
TransationDefinition.PROPAGETION.REQUIRED_NEW
建立一個新的事務,如果目前存在事務,則把目前事務掛起。
意思是創造一個新的事務,和原來的事務沒有任何關係。
TransationDefinition.PROPAGETION.SUPPORTS
如果目前存在事務,則加入該事務;如果目前沒有事務,則以非事務的方式繼續運作。
這種方式很隨意,沒有就沒有,有就有,有點無所謂的態度。
TransationDefinition.PROPAGATION.NOT_SUPPORTED
以非交易的方式運行,如果目前存在事務,則把目前交易掛起。
這種方式非常強硬,沒有就沒有,有也不支持,掛起來,不管它。
TransationDefinition.PROPAGETION_NEVER
#以非交易的方式運行,如果目前存在事務,則拋出例外。
這種方式更加強硬,沒有就沒有,反而報錯,他對大家宣稱:我從不支持事務。
TransationDefinition.PROPAGETION_MANDATORY
如果目前有事務,則加入該交易;如果目前沒有事務,則拋出例外。
這種方式可以說是最強硬的,沒有事務就直接報錯,它對全世界說:我必須要有事務。
TransationDefinition.PROPAGETION_NESTED
如果目前存在事務,則建立一個交易作為目前交易的巢狀事務來運作;如果目前沒有事務,則該取值等價於
TransationDefinition .PROPAGETION_REQUIRED
聲明式交易
使用
#現在來看在springboot中,如果使用宣告式交易:
@Transactional public void save(Object ob){ }
只要在方法上增加@ Transactional註解方法就可以被事務管理起來。
原始碼
看一下註解Transactional的原始碼:
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; Propagation propagation() default Propagation.REQUIRED; Isolation isolation() default Isolation.DEFAULT; int timeout() default TransactionDefinition.TIMEOUT_DEFAULT; boolean readOnly() default false; Class<? extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; }
預設值
readOnly : 是否僅僅只讀。預設讀寫都可以
timeout : 交易逾時時間,預設沒有逾時時間
isolation: 交易的隔離等級預設:TransactionDefinition.ISOLATION_DEFAULT(見上文隔離等級)
propagation :交易的傳播屬性預設:TransactionDefinition.PROPAGATION_REQUIRED
#注意事項
- ##註解應該只應用到public方法上
- #自呼叫問題:如果類別中沒有註解方法呼叫有註解的方法,那麼外部在呼叫沒有註解的方法時,有註解的方法不會產生交易
以上是如何理解spring事務及聲明式事務的使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

MySQL在Web應用中的主要作用是存儲和管理數據。 1.MySQL高效處理用戶信息、產品目錄和交易記錄等數據。 2.通過SQL查詢,開發者能從數據庫提取信息生成動態內容。 3.MySQL基於客戶端-服務器模型工作,確保查詢速度可接受。

在 Docker 中啟動 MySQL 的過程包含以下步驟:拉取 MySQL 鏡像創建並啟動容器,設置根用戶密碼並映射端口驗證連接創建數據庫和用戶授予對數據庫的所有權限

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

優雅安裝 MySQL 的關鍵在於添加 MySQL 官方倉庫。具體步驟如下:下載 MySQL 官方 GPG 密鑰,防止釣魚攻擊。添加 MySQL 倉庫文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 倉庫緩存:yum update安裝 MySQL:yum install mysql-server啟動 MySQL 服務:systemctl start mysqld設置開機自啟動

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL適合Web應用和內容管理系統,因其開源、高性能和易用性而受歡迎。 1)與PostgreSQL相比,MySQL在簡單查詢和高並發讀操作上表現更好。 2)相較Oracle,MySQL因開源和低成本更受中小企業青睞。 3)對比MicrosoftSQLServer,MySQL更適合跨平台應用。 4)與MongoDB不同,MySQL更適用於結構化數據和事務處理。
