MySQL中的事务

前言

本篇文章主要介绍的是事务相关概念,结合MySQL进行分析。

事务的概念

事务是用户定义的一个数据库操作序列,是同一情况下下进行的多次对数据库的增删改的行为的集合。可以理解为在同一个流程中多次对数据库进行增删改等操作,我们可以称这些操作是在同一事务中。

事务的应用场景说明

在实际的业务开发中,有些业务操作要多次访问数据库。一个业务要发送多条 SQL 语句给数据库执行。需要将多次访问数据库的操作视为一个整体来执行,要么所有的 SQL 语句全部执行成功。如果其中有一条 SQL 语句失败,就进行事务的回滚,所有的 SQL 语句全部执行失败。

有一个最经典的转账的例子,张三给李四转账,张三账号减钱,李四账号加钱,加钱减钱是在同一事务中。

-- 创建数据表
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('张三', 1000), ('李四', 1000);

模拟张三给李四转 500 元钱,一个转账的业务操作最少要执行下面的 2 条语句:

  1. 张三账号-500
  2. 李四账号+500
-- 1. 张三账号-500
UPDATE account SET balance = balance - 500 WHERE id=1;
-- 2. 李四账号+500
UPDATE account SET balance = balance + 500 WHERE id=2;

假设当张三账号上-500 元,服务器崩溃了。李四的账号并没有+500 元,数据就出现问题了,平白无故少了500元。我们需要保证其中一条 SQL 语句出现问题,整个转账就算失败。只有两条 SQL都成功了转账才算成功。这个时候就需要用到事务。

MySql提交事务

MYSQL 中可以有两种方式进行事务的操作:
1.手动提交事务 2.自动提交事务

1.MySQL可以使用SQL语句实现手动提交事务

功能 SQL语句
开启事务 start transaction;
提交事务 commit;
回滚事务 rollback;

手动提交事务的步骤:
执行成功的情况:开启事务 -> 执行 SQL 语句 -> 成功 -> 提交事务
执行失败的情况:开启事务 -> 执行 SQL 语句 -> 失败 -> 回滚事务


image

也就是说执行start transaction语句后,执行SQL语句,不会马上生效,而是需要执行commit语句才会生效,执行rollback语句则会取消这一事务内执行过的SQL语句,看起来就好像一个网页中确定或者取消的操作弹框。

2.mysql中是默认自动提交事务的,也就是说执行一条SQL语句后就会自动提交,立即生效。
mysql默认自动提交事务是可以修改的,只需要执行SQL语句set autocommit = 0;
将事务提交方式恢复为自动提交set autocommit = 1;
这样就不用执行start transaction手动开启事务了。

事务原理

事务开启之后, 所有的操作都会临时保存到事务日志中, 事务日志只有在得到 commit 命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback,断开连接等情况)。

原理图
image
步骤:

1 创建连接时创建此用户临时日志文件
2 开启事务以后,所有的操作都会先写入到临时日志文件中
3 所有的查询操作从表中查询,但会经过日志文件加工后才返回
4 如果事务提交则将日志文件中的数据写到表中,否则清空日志文件。

回滚点

在某些成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前面操作都已经成功,可以在当前成功的位置设置一个回滚点。可以供后续失败操作返回到该位置,而不是返回所有操作,这个点称之为回滚点。

回滚点操作语句 SQL语句
设置回滚点 savepoint 回滚点名字;
回滚到回滚点 rollback to 回滚点名字;

总结:设置回滚点可以让我们在失败的时候回到设置的某一回滚点,而不是回到事务开启的时候。

事务的四大特性(ACID)

事务特性 含义
原子性(Atomicity) 事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency) 事务前后数据的完整性必须保持一致
隔离性(Isolation) 是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离,不能相互影响。
持久性(Durability) 指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

事务的隔离级别

事务在操作时的理想状态:多个事务之间互不影响,如果隔离级别设置不当就可能引发并发访问问题。这些并发问题都是由于不同事务直接交叉了,没有完全隔离开来。

并发访问的问题 含义
脏读 一个事务读取到了另一个事务中尚未提交的数据,比如一个事务增加一条数据,但是还没有提交,此时另一个事务读到并使用了这条未提交的数据,这条数据就是脏数据,并不是真实的;因为如果增加这条数据的事务回滚了,那么这条数据就不存在了,但是又被另一个事务读取使用了,就会出问题。删除和更新操作也是一样的
不可重复读 一个事务中两次读取的数据内容不一致,要求的是一个事务中多次读取时数据是一致的,这是事务 update 时引发的问题 。比如事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
幻读 一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是 insert 或 delete 时引发的问题;比如事务A事先读取了数据共100条,事务B紧接着删除或者增加两条数据并提交事务,而事务A再次统计数据时发现数据量不是100条了。

脏读这种情况是存在的,一个事务未提交的数据,另一个事务是能读到的,只不过在MySQL中默认隔离级别为第二级,屏蔽了这种情况。可以手动设置为读未提交,测试能读到没有提交的数据。

MySQL数据库有四种隔离级别:上面的级别最低,下面的级别最高。 “是”表示会出现这种问题, “否”表示不
会出现这种问题。

级别 名称 隔离级别 脏读 不可重复读 幻读 数据库默认隔离级别
1 读未提交 read uncommitted
2 读已提交 read committed Oracle 和 SQL Server
3 可重复读 repeatable read MySQL
4 串行化 serializable

设置事务隔离级别,需要退出 MSQL 再进入 MYSQL 才能看到隔离级别的变化

CSDN:https://blog.csdn.net/qq_27682773
简书:https://www.jianshu.com/u/e99381e6886e
博客园:https://www.cnblogs.com/lixianguo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 什么是事务? 事务就是一组应该一起成功或一起失败的SQL语句。事务应该具备原子性、一致性、隔离性和持久性(ACID...
    即墨灯火阅读 289评论 0 0
  • 事务 定义 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行 注意:在MySQL中只...
    咖A喱阅读 404评论 0 7
  • 上周工作中再次使用到了事务。使用场景是执行一个sql组,包含多个sql语句。想了想,这些sql语句要么同时执行,要...
    rightchen阅读 7,519评论 0 1
  • ACID,事务的基本要素 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞...
    即墨灯火阅读 356评论 0 0
  • 致老师 老师 这是多么高贵的称呼 大师 只有患者康复的医生称呼才行 我习惯了老师这种称谓 大师们都心知肚明 有一位...
    端阳五月五1950阅读 102评论 0 0