MySQL5.5 及以后版本的默认存储引擎使用的是 InnoDB,接下来针对事务的讲解都是基于 InnoDB 存储引擎的。

事务的定义

事务:数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作; 事务是一组不可再分割的操作集合(工作逻辑单元)。

典型事务使用场景:转账

update user_account set balance = balance - 1000 where userID = 3;
update user_account set balance = balance + 1000 where userID = 1;

MySQL 开启事务

/*BEGIN / START TRANSACTION        --手工COMMIT / ROLLBACK                --事务提交或回滚SET SESSION autocommit = ON/OFF  --设定会话级别事务是否自动开启
*/

MySQL 默认是开启事务的,通过 SHOW VARIABLES like 'autocommit'; 可以查看 MySQL 的事务开启情况。

  • 在 autocommit = ON(自动提交事务)的情况下,可以执行 BEGIN; 或者 START TRANSACTION; 命令,改为手动提交事务,执行完 SQL 语句后,需要通过 COMMIT 命令提交事务,或者通过 ROLLBACK 命令回滚事务。
  • 在 autocommit = OFF(手动提交事务)的情况下,执行完 SQL 语句后,需要通过 COMMIT 命令提交事务,或者通过 ROLLBACK命令回滚事务。

JDBC 编程

connection.setAutoCommit(boolean);

测试命令

SHOW VARIABLES like 'autocommit';/* autocommit为ON */
update teacher set name ='seven' where id =1;
insert teacher (name,age) value ('james',22);
delete from teacher where name = 'james';/* autocommit为ON如何开启事务 */
BEGIN;
START TRANSACTION;update teacher set name ='seven' where id =1;
insert teacher (name,age) value ('james',22);
delete from teacher where name = 'james';COMMIT;
ROLLBACK;/* 将autocommit改成OFF */
set session autocommit = OFF;
update teacher set name ='seven' where id =1;
insert teacher (name,age) value ('james',22);
delete from teacher where name = 'james';COMMIT;
ROLLBACK;

事务 ACID 特性

原子性(Atomicity):最小的工作单元,整个工作单元要么一起提交成功,要么全部失败回滚。

一致性(Consistency):事务中操作的数据及状态改变是一致的,即写入资料的结果必须完全符合预设的规则,不会因为出现系统意外等原因导致状态的不一致。

隔离型(Isolation):一个事务所操作的数据在提交之前,对其他事务的可见性设定(一般设定为不可见)。

持久性(Durability):事务所做的修改就会永久保存,不会因为系统意外导致数据的丢失。

事务并发带来了哪些问题

脏读

比如 user 表中有一条用户数据,执行了如下操作:

  1. 事务B更新 id=1 的数据,age 更新为18,不提交事务
  2. 事务A查询 id=1 的数据
  3. 事务B回滚刚才的更新操作

这个时候,事务A中查询出的 id=1 的数据,age 的值是16还是18?

不可重复读

比如 user 表中有一条用户数据,执行了如下操作:

  1. 事务A查询 id=1 的数据
  2. 事务B更新 id=1 的数据,age 更新为18,并提交事务
  3. 事务A再次查询 id=1 的数据

这个时候,事务A两次查询出的 id=1 的数据,age 的值是16还是18?

幻读

比如在 user 表中执行了如下操作:

  1. 事务A查询 age>15 的数据
  2. 事务B新增一条数据,age=22,并提交事务
  3. 事务A再次查询 age>15 的数据

这个时候,事务A两次查询出的数据,数量是1条还是2条?

事务四种隔离级别

SQL92 ANSI/ISO标准:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

Read Uncommitted(未提交读) –未解决并发问题

事务未提交对其他事务也是可见的,脏读(dirty read)

Read Committed(提交读) –解决脏读问题

一个事务开始之后,只能看到自己提交的事务所做的修改,不可重复读(non repeatable read)

Repeatable Read(可重复读) –解决不可重复读问题

在同一个事务中多次读取同样的数据结果是一样的,这种隔离级别未定义解决幻读的问题

Serializable(串行化) –解决所有问题

最高的隔离级别,通过强制事务的串行执行

InnoDB 引擎对隔离级别的支持程度

事务隔离级别的并发能力:未提交读 > 已提交读 > 可重复读 > 串行化

InnDB 引擎默认的事务隔离级别是可重复读(Repeatable Read),在该级别中它把幻读的问题也解决了。InnDB 中事务隔离级别通过锁、MVCC 实现。

通过如下语句查看 InnoDB 的默认事务隔离级别:

/* 全局、当前会话的隔离级别 */
SELECT @@global.tx_isolation, @@tx_isolation;

通过如下语句设置 InnoDB 的事务隔离级别:

/* 设置全局隔离级别 */
set global transaction isolation level read committed;
/* 设置当前会话的隔离级别 */
set session transaction isolation level read committed;

接下来我们来测试一下 InnoDB 的默认事务隔离级别(Repeatable Read)是否解决了脏读、不可重复读、幻读的问题。

数据准备:

CREATE TABLE `user` (`id` int(11) NOT NULL,`name` varchar(32) NOT NULL,`age` int(11) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;insert into `user` (`id`, `name`, `age`) values('1','Ada','16');

是否解决了脏读的问题?

开启两个 MySQL 客户端,模拟事务A和事务B的操作,执行步骤如下:

  1. 事务B开启手动事务,更新 id=1 的数据,age 更新为18,不提交事务
  2. 事务A查询 id=1 的数据
  3. 事务B回滚刚才的更新操作

图中的数字是执行步骤,通过下图可以看出事务A的执行结果是16,InnDB 的默认事务隔离级别完美的解决了脏读的问题。

是否解决了不可重复读的问题?

开启两个 MySQL 客户端,模拟事务A和事务B的操作,执行步骤如下:

  1. 事务A开启手动事务,查询 id=1 的数据
  2. 事务B更新 id=1 的数据,age 更新为18,并提交事务
  3. 事务A再次查询 id=1 的数据

图中的数字是执行步骤,通过下图可以看出事务A两次的执行结果都是16,没有受事务B更新操作的影响,InnDB 的默认事务隔离级别完美的解决了不可重复读的问题。

是否解决了幻读的问题?

开启两个 MySQL 客户端,模拟事务A和事务B的操作,执行步骤如下:

  1. 事务A开启手动事务,查询 age>15 的数据
  2. 事务B新增一条数据,age=22,并提交事务
  3. 事务A再次查询 age>15 的数据

图中的数字是执行步骤,通过下图可以看出事务A两次的执行结果都是一条数据,没有受事务B新增操作的影响,InnDB 的默认事务隔离级别完美的解决了幻读的问题。

最后

为什么我不完全主张自学?
平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

Java全套资料免费领取方式:戳这里

压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

Java全套资料免费领取方式:戳这里

[外链图片转存中…(img-TSlRXtua-1623579155872)]

[外链图片转存中…(img-7ZfPG4jW-1623579155873)]

MySQL-InnoDB-事务相关推荐

  1. 面试:MySQL InnoDB 事务隔离

    面试:MySQL InnoDB 事务隔离 几种隔离级别 事务的隔离性是数据库处理数据的几大基础之一,而隔离级别其实就是提供给用户用于在性能和可靠性做出选择和权衡的配置项. ISO 和 ANIS SQL ...

  2. Mysql InnoDB事务

    Mysql InnoDB事务 学习了:https://www.cnblogs.com/benshan/archive/2013/01/19/2867244.html 转载于:https://www.c ...

  3. mysql innodb 事务_Mysql InnoDB事务

    事务特点 ACID ATOMICITY:原子性 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这 ...

  4. mysql怎么实现事务序列化_一文快速搞懂MySQL InnoDB事务ACID实现原理(转)

    这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔 ...

  5. mysql innodb事务中_MySQL InnoDB如何保证事务特性示例详解

    前言 如果有人问你"数据库事务有哪些特性"?你可能会很快回答出原子性.一致性.隔离性.持久性即ACID特性.那么你知道InnoDB如何保证这些事务特性的吗?如果知道的话这篇文章就可 ...

  6. mysql innodb事务中 出现_MySql InnoDB事务死锁问题

    这篇博客的文章内容发生于某天晚上服务端日志报了一大堆 Deadlock found when trying to get lock; try restarting transaction,当时通过字面 ...

  7. MySQL DBA亲授MySQL InnoDB事务ACID实现原理

    说到数据库事务,想到的就是要么都做修改,要么都不做,或者是 ACID 的概念.其实事务的本质就是锁.并发和重做日志的结合体. 这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原 ...

  8. mysql innodb 事务_MySQL学习笔记之InnoDB事务实现

    我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式. 同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力. 所以 ...

  9. MySQL InnoDB事务结构体代码变量全攻略(附源码)

    写在前面 ​ InnoDB是MySQL的一个存储引擎,支持事务,支持非堵塞的一致性读,物理存储结构是Page,每个事务都有回滚日志,重做日志,事务还会有死锁检测,各种各样不同的锁等等. 翻看InnoD ...

  10. mysql innodb 读加锁_InnoDB 读大量数据时会加读锁么?

    结论 默认不会加读锁!但 MySQL InnoDB 的可重复读并不保证避免幻读,需要应用使用加锁读来保证.而这个加锁度使用到的机制就是 next-key locks. 隔离级别说明 MySQL Inn ...

最新文章

  1. 从github上下载项目到eclipse
  2. retinaface训练笔记
  3. JSTL中fmt标签详解
  4. POJ2709 染料贪心
  5. 设计模式之---Factory
  6. Spring Boot整合Thymeleaf模板引擎
  7. Android APK 打包过程 MD
  8. 【Codeforces Round #452 (Div. 2) C】 Dividing the numbers
  9. Python笔记-windows平台中Flask打包成exe
  10. 再问数据中台-数据中台和数据仓库,数据平台的关系是什么?
  11. [转] Centos 6.4 python 2.6 升级到 2.7
  12. [UWP]理解ControlTemplate中的VisualTransition
  13. XML内容要有根标签:Extra content at the end of the document
  14. 金融用户画像的数据合规法律问题
  15. bci测试如何整改_电源动态响应测试,什么样的波形算合格?
  16. (一)GPS与基站定位
  17. oracle中rollup函数与mysql中with rollup区别
  18. react ssr php,从零开始搭建React同构应用(三):配置SSR
  19. 基于Python语言豆瓣电影数据挖掘与分析
  20. Fabric0.6 与1.0

热门文章

  1. 2021年中国船用鼓风机市场趋势报告、技术动态创新及2027年市场预测
  2. 云风:不加班、不炫技,把复杂的问题简单化
  3. 绝密邮件曝光!看乔布斯如何拯救濒危的苹果?
  4. DropBox:机器学习每年可以为我们节省170万的文档预览费用
  5. 疫情之后,人工智能该如何走?
  6. 中兴的芯片,到底什么水平?
  7. 零基础物联网开发,踩坑无数,得到这份宝典 | 原力计划
  8. 微博回应用户被“劫持”;途牛否认破产清算;微软宣布开源 MsQuic | 极客头条...
  9. 官宣!阿里进军 5G,成立 XG 实验室发力新基建
  10. 我有一辆机器人小车,怎么让它跑起来,还会避障、目标跟踪、路径规划?