【MySQL基礎篇】事務

事務簡介

事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。

典型事例:銀行轉賬操作

假設張三向李四進行轉賬操作首先第一步我們應該查詢張三用戶的余額,如果余額充足,則張三用戶余額減少,最后李四用戶余額增加

事務的步驟分為:1、開啟事務2、回滾事務(把臨時修改的數據恢復回去,能夠保證如果出現異常,全部操作都會回滾,保證數據的完整性和一致性)3、提交事務

默認MySQL的事務是自動提交的,也就是說,當執行一條DML語句,MySQL會立即隱式的提交事務。

事務操作?

· 查看/設置事務提交方式

SELECT @@autocommit;

SET @@autocommit=0;

· 提交事務

COMMIT;?

· 回滾事務

ROLLBACK;?

#事務操作
#數據準備
create table account(id int primary key auto_increment comment '主鍵ID',name varchar(10) comment '姓名',money int comment '余額'
)comment '賬戶表';
insert into account values(null,'張三',2000),(null,'李四',2000);
#轉賬操作
select @@autocommit;
set @@autocommit=0;
select * from account where name='張三';
#2、將張三賬戶余額減1000
update account set money =money-1000 where name='張三';
程序執行錯誤
#3、將李四賬戶余額增加1000
update account set money =money+1000 where name='李四';
#提交事務
commit;
#回滾事務
rollback;
#恢復數據
update account set money=2000 where name='張三'||name='李四';

方式二:不設置事務的提交方式

·? 開啟事務

START TRANSACTION 或 BEGIN;

·? 提交事務

COMMIT;?

?·? 回滾事務

rollback;

#方式二:
start transaction ;
set @@autocommit=1;
select * from account where name='張三';
#2、將張三賬戶余額減1000
update account set money =money-1000 where name='張三';
程序執行錯誤...
#3、將李四賬戶余額增加1000
update account set money =money+1000 where name='李四';
#提交事務
commit;
#回滾事務
rollback;

事務四大特性:ACID

?· 原子性(Atomicity):事務是不可分割的最小操作單元,要么全部成功,要么全部失敗。

· 一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態。

· 隔離性(Isolation):數據庫系統提供的隔離機制,保證事務在不受外部并發操作影響的獨立環境下運行。

· 持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的。

并發事務問題?

問題描述
臟讀一個事務讀到另一個事務還沒有提交的數據
不可重復讀一個事務先后讀取同一條記錄,但兩次讀取的數據不同,稱之為不可重復讀
幻讀一個事務按照條件查詢數據時,沒有對應的數據行,但是在插入數據時,又發現這行數據已經存在,好像出現了”幻影“

?

?

事務的隔離級別?

隔離級別臟讀不可重復讀幻讀
Read uncommitted
Read committed×
Repeatable Read(默認)××
Serializable×××

注意:從上到下隔離級別越來越高,?Serializable隔離級別最高但性能最差;Read uncommitted隔離級別最低(數據安全性最差),但性能最優。

#查詢事務隔離級別

SELECT @@TRANSACTION_ISOLATION;

#設置事務隔離級別

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

#查看事物的隔離級別
select @@transaction_isolation;
#設置事務隔離級別
set session transaction isolation level read uncommitted;
#改回默認值
set session transaction isolation level repeatable read ;

臟讀演示:(兩個客戶端演示)

#第一個客戶端
mysql> use test
Database changed
mysql> set session transaction isolation level read uncommitted-> ;
Query OK, 0 rows affected (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 張三 |  2000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 張三 |  2000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 張三 |  1000 |
|  2 | 李四 |  2000 |
+----+------+-------+
#第二個客戶端
mysql> use test
Database changed
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> update account set money=money-1000 where name='張三';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

不可重復讀:(此時隔離級別為Read committed)

#第一個客戶端
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 張三 |  1000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 張三 |  2000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)
#第二個客戶端
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> update account set money=money+1000 where name='張三';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> commit;
Query OK, 0 rows affected (0.00 sec)

幻讀:(此時隔離級別為Repeatable read)

#第一個客戶端start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 張三 |  2000 |
|  2 | 李四 |  2000 |
+----+------+-------+
2 rows in set (0.00 sec)mysql> select * from account where id=3;
Empty set (0.00 sec)insert into account(id,name,money) values(3,'王小五',2000);
ERROR 1062 (23000): Duplicate entry '3' for key 'account.PRIMARY'
mysql> select * from account;
+----+------+-------+
| id | name | money |
+----+------+-------+
|  1 | 張三 |  2000 |
|  2 | 李四 |  2000 |
|  3 | 王五 |  2000 |
+----+------+-------+
3 rows in set (0.00 sec)
#第二個客戶端start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> insert into account(id,name,money) values(3,'王五',2000);
Query OK, 1 row affected (0.00 sec)mysql> commit;
Query OK, 0 rows affected (0.00 sec)

?

?

?

?

?

?

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

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

相關文章

Python:正則表達式相關整理

最近因為一些原因頻繁使用正則表達式,因為以前系統整理過關于正則表達式的相關知識,所以這里僅記錄使用期間遇到的問題。 本文內容基于re包 1. match和search方法的區別 在Python中,re.search和re.match都是用于匹配字符串的正則表達式函數&a…

防火墻NAT、智能選路綜合實驗

一、實驗拓撲 二、實驗要求 1,辦公區設備可以通過電信鏈路和移動鏈路上網(多對多的NAT,并且需要保留一個公網IP不能用來轉換) 2,分公司設備可以通過總公司的移動鏈路和電信鏈路訪問到Dmz區的http服務器 3,多出口環境基于帶寬比例…

Curator分布式鎖

Curator 是一個用于 Apache ZooKeeper 的客戶端庫,提供了更高級的抽象和工具,以簡化 ZooKeeper 的使用。Curator 是由 Netflix 開發的,并已成為分布式應用程序中使用 ZooKeeper 的事實標準。它解決了原生 ZooKeeper API 使用復雜、易出錯的問…

node js安裝、配置(Windows版)

目錄 node js 安裝 node js 全局配置 1、全局安裝路徑 2、全局緩存路徑 3、修改環境變量 pnpm安裝、卸載 全局安裝pnpm 驗證pnpm版本 卸載pnpm 1、移除全局安裝的包 2、移除pnpm cli 腳本直接安裝 npm安裝的使用命令直接卸載 node js 安裝 cmd 查看是否存在&…

容器docker 架構命令案例

文章目錄 前言一、docker1.1 為什么有docker1.2 docker架構1.3 docker 安裝1.4 docker中央倉庫1.5 docker 基本指令1.6 docker數據卷,掛載例:nginx 數據卷掛載例:mysql 本地持久化 1.7 鏡像制作鏡像結構dockerfile基礎指令容器生成鏡像 1.8 d…

宿主機訪問docker容器中的mysql被拒絕

問題: 解決方案: 1.進入docker中的mysql容器 docker exec -it 容器名稱/id /bin/bash 2.登錄用戶 mysql -u root -p 3.進去mysql自帶的管理數據庫mysql use mysql; 4.查詢用戶的訪問權限 SELECT user, host FROM user WHERE userroot;5.發現該用…

繪畫平臺小程序的設計

管理員賬戶功能包括:系統首頁,個人中心,學生管理,講師管理,課程類型管理,課程信息管理,課程購買管理,作業類型管理 開發系統:Windows 架構模式:SSM JDK版本&…

AURORA仿真

AURORA 仿真驗證 定義:AURORA是一種高速串行通信協議,通常用于在數字信號處理系統和其他電子設備之間傳輸數據。它提供了一種高效的方式來傳輸大量數據,通常用于需要高帶寬和低延遲的應用中。AURORA協議通常由Xilinx公司的FPGA器件支持&#…

golang 項目打包部署環境變量設置

最近將 golang 項目打包部署在不同環境,總結一下自己的心得體會,供大家參考。 1、首先要明確自己目標服務器的系統類型(例如 windows 或者Linux) ,如果是Linux 還需要注意目標服務器的CPU架構(amd或者arm) 目標服務器的CPU架構可執行命令&…

對Mapper.xml文件進行深入的學習

1. 前言 既上次在Mapper.xml文件出現bug之后&#xff0c;痛改前非&#xff0c;決定吃透Mapper.xml映射文件。 讓我們通過具體的代碼段來進一步理解 MyBatis 的 Mapper XML 文件中的每個組成部分。 <?xml version"1.0" encoding"UTF-8"?> <!…

python 爬取當當網圖書榜

首先查看當當網好評書單頁面&#xff0c;找到翻頁的URL參數 直接用requests請求頁面 resp requests.get(url) 找到想要的信息&#xff0c;使用正則表達式把這些信息提取出來 patternre.compile(list_num.*?(\d).<.*?<img src"(.*?)".*?title"(.*?…

Eel入門還有一些案例

Eel入門還有一些案例 Eel 是一個 Python 庫&#xff0c;它允許 Python 程序通過簡單的 API 與網頁進行交互。它使用 WebSocket 協議來實現 Python 后端和 JavaScript 前端之間的實時通信。下面是關于 Eel 的用法、通信原理和使用場景的一篇博客文章。 Eel的基本原理 Eel的基本原…

針對vue3的render函數添加自定義指令

話不多說 直接上代碼 主要是給h函數設置自定義指令控制 import /styles/reset.css import /styles/global.scss import uno.cssimport { createApp } from vue import App from ./App.vue import { setupRouter } from ./router import { setupStore } from ./store import …

Android studio之編譯提示Could not find :umeng-asms-v1.2.1

1 、問題 Could not determine the dependencies of task :app:compileDebugJavaWithJavac. > Could not resolve all task dependencies for configuration :app:debugCompileClasspath.> Could not find :umeng-asms-v1.2.1:.Required by:project :app> Could not …

FGF14:腦部疾病新潛力靶標

成纖維細胞生長因子14&#xff08;FGF14&#xff09;是FGF11亞家族成員&#xff0c;在神經元的所有基本特性&#xff08;內在放電、興奮性和抑制性神經元的突觸傳遞和可塑性&#xff09;中發揮作用。 &#xff08;數據來源AlphaFold&#xff09; FGF14由247個氨基酸組成&#x…

實戰篇(九):解鎖3D魔方的秘密:用Processing編程實現交互式魔方

解鎖3D魔方的秘密:用Processing編程實現交互式魔方 使用 Processing 創建一個 3D 魔方效果展示1. 安裝 Processing2. 項目結構3. 代碼實現4. 代碼解釋4.1. 初始化魔方4.2. 繪制魔方4.3. 處理鼠標事件4.4. 檢查點擊的面4.5. 旋轉面和最終確定旋轉5. 運行和測試6. 細節解釋6.1. …

【資源調度】2-如何解決資源調度問題?

導讀&#xff1a;本期是全網最全【資源調度】系列推文的第2期(共50期左右)。上期我們在《何為調度&#xff1f;》中&#xff0c;對調度的定義與作用、計劃與調度的關系、調度問題的拆解做了詳細介紹。從本期開始&#xff0c;我們選擇【客服調度】場景作為【資源調度】問題的具象…

51單片機(STC8H8K64U/STC8051U34K64)_RA8889_8080參考代碼(v1.3)

硬件&#xff1a;STC8H8K64U/STC8051U34K64 RA8889開發板 硬件跳線變更為并口8080模式&#xff0c;PS00x&#xff0c;R143&#xff0c;R142不接&#xff0c;R141無關 8080接口電路連接圖&#xff1a; 實物連接圖&#xff1a; RA8889開發板外接MCU連接器之引腳定義&…

IMS架構中的注冊與會話流程:RTPEngine集成及消息路由詳解

目錄 S-CSCF 調用 RTPengine 整體路由 注意 IMS 注冊流程 和 IMS 會話流程 的區別 IMS注冊流程 IMS會話流程(如INVITE請求) 這種設計的原因 P-CSCF 調用 RTPengine S-CSCF 調用 RTPengine 整體路由 UA a生成SDP offer&#xff0c;發送SIP INVITE請求(包含SDP offer)&…

核密度估計KDE和概率密度函數PDF(深入淺出)

目錄 1. 和密度估計&#xff08;KDE&#xff09;核密度估計的基本原理核密度估計的公式核密度估計的應用Python中的KDE實現示例代碼 結果解釋解釋結果 總結 2. 概率密度函數&#xff08;PDF&#xff09;概率密度函數&#xff08;PDF&#xff09;是怎么工作的&#xff1a;用圖畫…