阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

事务处理

417次阅读
没有评论

共计 3824 个字符,预计需要花费 10 分钟才能阅读完成。

一、事务概述

为了方便演示事务,我们需要创建一个 account 表:

CREATE TABLE account(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(30), balance NUMERIC(10.2) ); INSERT INTO account(NAME,balance) VALUES('zs', 100000); INSERT INTO account(NAME,balance) VALUES('ls', 100000); INSERT INTO account(NAME,balance) VALUES('ww', 100000); SELECT * FROM account;

1.1、什么是事务

银行转账!张三转 100 块到李四的账户,这其实需要两条 SQL 语句:

  • 给张三的账户减去 100 元

  • 给李四的账户加上 100 元

如果在第一条 SQL 语句执行成功后,在执行第二条 SQL 语句之前,程序被中断了(可能是抛出了某个异常,也可能是其他什么原因),那么李四的账户没有加上 100 元,而张三却减去了 100 元。这肯定是不行的!

你现在可能已经知道什么是事务了吧!== 事务中的多个操作,要么完全成功,要么完全失败!不可能存在成功一半的情况!== 也就是说给张三的账户减去 100 元如果成功了,那么给李四的账户加上 100 元的操作也必须是成功的;否则给张三减去 100 元,以及给李四加上 100 元都是失败的!

1.2、事务的四大特性(ACID)

原子性(Atomicity):事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。

一致性(Consistency):事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。

隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。

持久性(Durability):一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

二、MySQL 中的事务

在默认情况下,MySQL 每执行一条 SQL 语句,都是一个单独的事务。如果需要在一个事务中包含多条 SQL 语句,那么需要开启事务和结束事务。

** 开启事务:**start transaction;

结束事务:commitrollback。

在执行 SQL 语句之前,先执行 strat transaction,这就开启了一个事务(事务的起点),然后可以去执行多条 SQL 语句,最后要结束事务,commit 表示提交,即事务中的多条 SQL 语句所做出的影响会持久化到数据库中。或者 rollback,表示回滚,即回滚到事务的起点,之前做的所有操作都被撤消了!

下面演示 zs 给 li 转账 100 元的示例:

START TRANSACTION; UPDATE account SET balance=balance-100 WHERE id=1; UPDATE account SET balance=balance+100 WHERE id=2; ROLLBACK ;
START TRANSACTION;
UPDATE account SET balance=balance-100 WHERE id=1;
UPDATE account SET balance=balance+100 WHERE id=2;
COMMIT ;

三、JDBC 事务

在 jdbc 中处理事务,都是通过 Connection 完成的!

同一事务中所有的操作,都在使用同一个 Connection 对象!

3.1、JDBC 中的事务

Connection 的三个方法与事务相关:

setAutoCommit(boolean):设置是否为自动提交事务,如果 true(默认值就是 true)表示自动提交,也就是每条执行的 SQL 语句都是一个单独的事务,如果设置 false,那么就相当于开启了事务了;

con.setAutoCommit(false)表示开启事务!!!

commit():提交结束事务;

con.commit(); 表示提交事务

rollback():回滚结束事务。

con.rollback(); 表示回滚事务

jdbc 处理事务的代码格式:

try {

con.setAutoCommit(false);// 开启事务…

….

con.commit();//try 的最后提交事务

} catch() {

con.rollback();// 回滚事务

}

public void transfer(boolean b) {Connection con = null; PreparedStatement pstmt = null; try {con = JdbcUtils.getConnection(); // 手动提交 con.setAutoCommit(false); String sql = "update account set balance=balance+? where id=?"; pstmt = con.prepareStatement(sql); // 操作 pstmt.setDouble(1, -10000); pstmt.setInt(2, 1); pstmt.executeUpdate(); // 在两个操作中抛出异常 if(b) {throw new Exception();} pstmt.setDouble(1, 10000); pstmt.setInt(2, 2); pstmt.executeUpdate(); // 提交事务 con.commit();} catch(Exception e) {// 回滚事务 if(con != null) {try {con.rollback(); } catch(SQLException ex) {}} throw new RuntimeException(e); } finally {// 关闭 JdbcUtils.close(con, pstmt); } }

四、事务隔离级别

4.1、事务的并发读问题

脏读:读取到另一个事务未提交数据;

不可重复读:两次读取不一致;

幻读(虚读):读到另一事务已提交数据。

4.2、并发事务问题

因为并发事务导致的读问题有如下三类:

脏读(dirty read)

​ 读到另一个事务的未提交更新数据,即读取到了脏数据;

不可重复读(unrepeatable read)

​ 对同一记录的两次读取不一致,因为另一事务对该记录做了修改;

幻读(虚读)(phantom read)

​ 对同一张表的两次查询不一致,因为另一事务插入了一条记录;

脏读举例

事务 1:张三给李四转账 100 元

事务 2:李四查看自己的账户

l t1:事务 1:开始事务

l t2:事务 1:张三给李四转账 100 元

l t3:事务 2:开始事务

l t4:事务 2:李四查看自己的账户,看到账户多出 100 元(脏读)

l t5:事务 2:提交事务

l t6:事务 1:回滚事务,回到转账之前的状态

不可重复读举例

事务 1:酒店查看两次 1048 号房间状态

事务 2:预订 1048 号房间

l t1:事务 1:开始事务

l t2:事务 1:查看 1048 号房间状态为空闲

l t3:事务 2:开始事务

l t4:事务 2:预定 1048 号房间

l t5:事务 2:提交事务

l t6:事务 1:再次查看 1048 号房间状态为使用

l t7:事务 1:提交事务

对同一记录的两次查询结果不一致!

幻读举例

事务 1:对酒店房间预订记录两次统计

事务 2:添加一条预订房间记录

l t1:事务 1:开始事务

l t2:事务 1:统计预订记录 100 条

l t3:事务 2:开始事务

l t4:事务 2:添加一条预订房间记录

l t5:事务 2:提交事务

l t6:事务 1:再次统计预订记录为 101 记录

l t7:事务 1:提交

对同一表的两次查询不一致!

不可重复读和幻读的区别

l 不可重复读是读取到了另一事务的更新;

l 幻读是读取到了另一事务的 插入(MySQL 中无法测试到幻读);

4.3、四大隔离级别

4 个等级的事务隔离级别,在相同数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力是不同的。

SERIALIZABLE(串行化)

不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;

性能最差;

REPEATABLE READ(可重复读)(MySQL)

防止脏读和不可重复读,不能处理幻读问题;

性能比 SERIALIZABLE 好

READ COMMITTED(读已提交数据)(Oracle)

防止脏读,没有处理不可重复读,也没有处理幻读;

性能比 REPEATABLE READ 好

READ UNCOMMITTED(读未提交数据)

可能出现任何事务并发问题

性能最好

4.4、MySQL 隔离级别

MySQL 的默认隔离级别为 Repeatable read,可以通过下面语句查看:

select @@tx_isolation

也可以通过下面语句来设置当前连接的隔离级别:

set transaction isolationlevel [4 先 1]

4.5、JDBC 设置隔离级别

con. setTransactionIsolation(int level)

参数可选值如下:

Connection.TRANSACTION_READ_UNCOMMITTED;

Connection.TRANSACTION_READ_COMMITTED;

Connection.TRANSACTION_REPEATABLE_READ;

Connection.TRANSACTION_SERIALIZABLE。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计3824字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7985033
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

  300 元就能买到的 ” 小钢炮 ”?惠普 7L 四盘位小主机解析 最近...
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装2026年最强个人助理ClawdBot、完整安装教程

如何安装 2026 年最强个人助理 ClawdBot、完整安装教程 一、前言 学不完,根本学不完!近期,一款名...