數據庫事務以及JDBC實現事務

一、數據庫事務

數據庫事務(Database Transaction)是數據庫管理系統中的一個核心概念,它代表一組操作的集合,這些操作要么全部執行成功,要么全部不執行,即操作數據的最小執行單元,保證數據庫的數據一致性、完整性和可靠性。

一條數據庫語句也是事務。

1、事務的ACID特性

1.原子性(Atomicity)

定義:事務中的操作要么全部完成,要么全部不做。

類比:就像你去銀行進行轉賬操作,銀行要么把錢從你賬戶轉到對方賬戶,要么不做任何改變。如果途中出錯,轉賬的整個過程會被“撤銷”,就像根本沒有進行過轉賬一樣。

2.一致性(Consistency)

定義:事務開始之前和結束之后,數據庫必須保持一致的狀態。事務的執行不能破壞數據庫的規則(如約束、觸發器等)。

類比:銀行的轉賬必須符合規則,比如賬戶的余額不能為負。即使你操作了很多次,只要操作成功,每次操作之后的賬戶余額都應該是合法的。

3.隔離性(Isolation)

定義:事務執行的過程中,其它事務不能看到中間的結果,直到事務完全提交。

類比:假設你和另一個人在銀行同時轉賬,你的轉賬操作在完成前不會對對方的轉賬產生任何影響。如果沒有隔離性,兩個操作可能會影響對方的賬戶余額。

4.持久性(Durability)

定義:一旦事務提交,數據的修改是永久性的,即使系統崩潰,也不會丟失。

類比:轉賬一旦完成,銀行系統保證這筆轉賬數據會被保留下來,哪怕系統發生故障,數據依然能夠恢復。

2、事務的典型示例

假設你要從賬戶A轉賬100元到賬戶B,整個過程可能包括以下幾個操作:

從賬戶A扣款100元

向賬戶B存款100元

如果這兩個操作都成功完成,轉賬就完成了。但如果在第一個操作完成后,第二個操作失敗了(比如系統崩潰),那么賬戶A的100元已經被扣除了,但是賬戶B并沒有收到這100元。這種情況是不符合“原子性”的。

為了解決這個問題,數據庫使用事務來確保:

原子性:要么兩個操作都執行成功(100元從A扣除,B收到100元),要么兩個操作都不執行(賬戶A和賬戶B保持原狀)。

一致性:如果轉賬開始前的數據庫狀態是合法的(如余額不為負),那么轉賬完成后,數據庫狀態依然是合法的(A賬戶不會有負數,B賬戶的余額增加了100元)。

隔離性:在你完成轉賬前,別人無法看到你的轉賬結果,確保數據不會受到并發操作的影響。

持久性:一旦你提交了轉賬,無論系統發生什么故障,轉賬的數據都會保存下來。

3、MySQL客戶端演示事務

1.準備數據集

建表:

CREATE TABLE t_account ( 
id INT PRIMARY KEY auto_increment, 
username VARCHAR ( 20 ), 
money DOUBLE 
);

插入測試數據:

INSERT INTO account
VALUES( 1, '美美', 10000 );
INSERT INTO account
VALUES( 2, '冠希', 10000 );
INSERT INTO account
VALUES( 3, '小鳳', 10000 );
INSERT INTO account
VALUES( 4, '熊大', 10000 );
INSERT INTO account
VALUES( 5, '熊二', 10000 );

數據集準備完成。

2.實現事務的兩種方式

(1)使用start transaction命令

熊大給小鳳轉賬1000塊

此時還未提交或者回滾,表明事務還沒結束。如果此時發生異常,兩個賬戶中的money會回到事務開啟前的狀態。

進行回滾

看到數據庫是回到的事物開啟前的狀態。

此時進行了提交,看到數據庫中數據已被改變

(2)設置MySQL事務默認不提交

MySQL數據庫的事務是默認提交的

單獨執行

 update account set money=money-1000 where username ="熊大";

MySQL將這視為一個事務,并默認提交

使用命令

set autocommit = off;

set autocommit = 0;

取消MySQL的默認提交事務

如果不手動提交事務或回滾事務,數據庫中數據不做修改。

二、JDBC實現事務

JDBC實現事務只需要關閉MySQL的自動提交,并實現手動提交,即

// 關閉自動提交
conn.setAutoCommit(false);
// 手動提交事務
conn.commit();

當前數據庫信息:

模擬轉賬Java操作數據庫:

package com.goose;import com.goose.utils.JDBCUtils;import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;/*** @Author: Goose* @Description: TODO* @Date: 2025/5/11 11:19* @Version: 1.0*/public class JDBCShiWu {public static void main(String[] args) {Connection conn = JDBCUtils.getConnection();Statement stmt = null;try {// 關閉自動提交conn.setAutoCommit(false);stmt = conn.createStatement();String sql1 = "UPDATE account SET money = money - 1000 WHERE username = '熊大'";String sql2 = "UPDATE account SET money = money + 1000 WHERE username = '小鳳'";int i = stmt.executeUpdate(sql1);// int a = 10/0;int i2 = stmt.executeUpdate(sql2);System.out.println("i = "+i+", i2 = "+ i2);// 手動提交事務// conn.commit();} catch (SQLException e) {e.printStackTrace();}finally{JDBCUtils.close(conn,stmt);}}
}

執行結果:

關閉自動提交后,不進行手動提交數據庫信息不發生變化。

開啟手動提交,數據庫才能完成轉賬業務實現。

開啟事務后,如果在執行SQL時發生異常,也不會提交事務

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80997.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【vue】【環境配置】項目無法npm run serve,顯示node版本過低

解決方案:安裝高版本node,并且啟用高版本node 步驟: 1、查看當前版本 node -v2、配置nvm下載鏡像源 1)查看配置文件位置 npm root2)找到settings.txt文件 修改鏡像源為: node_mirror: https://npmmirro…

WPF之INotifyPropertyChanged實現

文章目錄 引言INotifyPropertyChanged接口基礎接口定義工作原理 基本實現方式標準實現示例CallerMemberName特性 高級實現技術基類實現通知多個屬性變化使用PropertyChanging事件 MVVM框架中的實現MVVM模式簡介MVVM框架中的實現Prism框架MVVM Light框架自定義MVVM基類 性能優化…

【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服務

原文地址:https://developer.aliyun.com/article/1662946 在當今快速發展的AI技術背景下,如何高效地集成模型能力成為開發者關注的重點。本文將手把手教你如何基于 Spring AI 搭建支持 SSE(Server-Sent Events)模式的 MCP 服務 相…

springboot集成langchain4j實現票務助手實戰

前言 看此篇的前置知識為langchain4j整合springboot,以及springboot集成langchain4j記憶對話。 Function-Calls介紹 langchain4j 中的 Function Calls(函數調用)是一種讓大語言模型(LLM)與外部工具(如 A…

MySQL-數據庫分布式XA事務

準備 innodb存儲引擎開啟支持分布式事務 set global innodb_support_axonMySQL數據庫XA事務的SQL語法如下: XA {START| BEGIN} xid {JOIN | RESUME} XA END xid {SUSPEND [ FOR MIGRATE]} XA PREPARE xid XA COMMIT xid [ONE PHASE] XA ROLLBACK xid XA RECOVER 完…

SAP 運維-冷門問題解決辦法

1.SAP Fiori幫助菜單鏈接如何配置? 答: 執行事務代碼HELP_CONFIG,選擇對應的Fiori部署模式,配置幫助菜單下的URL鏈接。 檢查配置的幫助菜單,執行事務代碼/N//UI2/FLP_CUS_CONF 或者SR13進行查看配置狀態與修改。

新型智慧園區技術架構深度解析:數字孿生與零碳科技的融合實踐

🏭在杭州亞運村零碳園區,光伏板與氫燃料大巴構成的能源網絡,正通過數字孿生技術實現智能調度。這不僅是格力電器與龍源電力在新能源領域的創新實踐,更是智慧園區4.0時代的標桿案例。當AI算法開始接管能源調度,當BIM建模…

Java轉Go日記(三十六):簡單的分布式

1.1.1. 簡單的分布式server 目前分布式系統已經很流行了,一些開源框架也被廣泛應用,如dubbo、Motan等。對于一個分布式服務,最基本的一項功能就是服務的注冊和發現,而利用zk的EPHEMERAL節點則可以很方便的實現該功能。EPHEMERAL節…

機器學習筆記——特征工程

大家好,這里是好評筆記,公主號:Goodnote,專欄文章私信限時Free。本筆記介紹機器學習中常見的特征工程方法、正則化方法和簡要介紹強化學習。 文章目錄 特征工程(Fzeature Engineering)1. 特征提取&#xff…

在 Ubuntu 20.04.6 LTS 中將 SCons 從 3.1.2 升級到 4.9.1

在 Ubuntu 20.04.6 LTS 中將 SCons 從 3.1.2 升級到 4.9.1,可以通過以下步驟完成: 方法 1:使用 pip 安裝(推薦) 步驟 1:卸載舊版本 SCons # 如果通過 apt 安裝的舊版本,先卸載 sudo apt remov…

LeetCode熱題100--234.回文鏈表--簡單

1. 題目 給你一個單鏈表的頭節點 head ,請你判斷該鏈表是否為回文鏈表。如果是,返回 true ;否則,返回 false 。 示例 1: 輸入:head [1,2,2,1] 輸出:true 示例 2: 輸入&#xf…

【markdown】介紹如何在markdown中繪制流程圖

在 Markdown 中編寫流程圖主要通過 ??Mermaid 語法??實現(多數平臺如 GitHub、VS Code、Typora 已原生支持)。以下是詳細方法: 1. 基礎流程圖?? 語法結構 用 mermaid 包裹代碼塊,指定方向后定義節點和連接線&#xff1a…

Java中使用自定義序列化器:自動添加View字段的實現與應用

Java 中 BigDecimal 序列化器:自動添加 View 返回字段的實現與應用 在 Java 開發過程中,數據的序列化與反序列化是非常重要的環節。當我們處理數值類型數據,特別是BigDecimal類型時,有時需要在序列化輸出中添加額外的視圖字段,以滿足前端展示或者特定業務需求。本文將通過…

Java類一文分解:JavaBean,工具類,測試類的深度剖析

解鎖Java類的神秘面紗:從JavaBean到測試類的深度剖析 前言一、JavaBean 類:數據的守護者(一)JavaBean 類是什么(二)JavaBean 類的特征(三)JavaBean 類的使用場景(四&…

機器學習-- 線性回歸、邏輯回歸

線性回歸 線性回歸是一種統計方法,用于發現變量之間的關系。在機器學習背景下,線性回歸可找出特征(Feature)與標簽(Lable)之間的關系。 例如,假設我們想要根據汽車的重量預測汽車的每加侖汽油行駛里程(mpg),并且我們有以下數據集: 線性回歸方程 Linear regressi…

Lua再學習

因為實習的項目用到了Lua,所以再來深入學習一下 函數 函數的的多返回值 Lua中的函數可以實現多返回值,實現方法是再return后列出要返回的值的列表,返回值也可以通過變量接收到,變量不夠也不會影響接收對應位置的返回值 Lua中傳…

TCP協議十大核心特性深度解析:構建可靠傳輸的基石

TCP(傳輸控制協議)作為互聯網的"交通指揮官",承載著全球80%以上的網絡流量。本文將深入解析TCP協議的十大核心特性,通過原理剖析、流程圖解和實戰案例,揭示其如何實現高效可靠的數據傳輸。 一、面向連接的可…

基于 Spring Boot 瑞吉外賣系統開發(十三)

基于 Spring Boot 瑞吉外賣系統開發(十三) 查詢套餐 在查詢套餐信息時包含套餐的分類名,分類名稱在category表中,因此這里需要進行兩表關聯查詢。 自定義SQL如下: select s.* ,c.name as category_name from setmeal…

華為IP(6)

VLAN聚合 VLAN聚合產生的技術背景 在一般是三層交換機中,通常采用一個VLAN接口的方式實現廣播域之間的互通,這在某些情況下導致了IP地址的浪費 因為一個VLAN對應的子網中,子網號、子網廣播地址、子網網關地址不能用作VLAN內的主機IP地址&a…

深度解析IP靜態的工作原理,IP靜態的應用場景又哪些?

一、什么是IP靜態? 當我們談到“IP靜態”時,大家可能首先想到的是與“動態IP”相對的概念。確實如此,靜態IP是一種固定分配的IP地址,也就是說,在特定時間內,分配給你的IP地址不會有所更改——無論你完成多…