MySQL事务

什么是事务

数据库事务(Database Transaction),就是并发控制的基本单位,是指作为单个逻辑工作单元执行的一系列操作,其中的操作要么完全执行,要么完全地不执行

以整个转账过程为例,我们希望转账和收账操作要么同时成功,要么同时失败。这时,事务就可以帮助我们。

数据库事务具有ACID属性

ACID

原子性(Atomicity)

原子性是指事务的所有操作要么全部完成,要么全部失败。事务在执行时发生错误的话,会回滚到事务开始前的状态。

回滚

所有事务进行的修改都会先记录到这个回滚日志中,然后在对数据库中的对应行进行写入。

一致性(Consistency)

一致性是指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
保证数据库一致性是指当事务完成时,必须使所有数据都具有一致的状态(如主键约束、外键约束以及一些约束检查等等)。在关系型数据库中,所有的规则必须应用到事务的修改上,以便维护所有数据的完整性。

我的理解是,已转账为例,转账前后,转账和收账人账户余额里存储的数据都是数字,具体的数字会变化,但是数据类型始终都是数字,并且转账前后两个账户的总余额应当不变。

隔离性(Isolation)

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

事务隔离性的四个级别

读未提交 RAED UNCOMMITED

使用查询语句不会加锁,可能会读到未提交的行,也就是脏读(Dirty Read)。
比如说,现有空表。事务a向表中插入值1但未提交,事务b此时读取表,却读到了1,这就是脏读。

读提交 READ COMMITED

只对记录加记录锁,而不会在记录之间加间隙锁,所以允许新的记录插入到被锁定记录的附近,所以再多次使用查询语句时,可能得到不同的结果,即不可重复读(Non-Repeatable Read)。
比如说在事务a中查询了一张表,返回了一个结果;然后在事务b中修改了表中被查询的数据并提交了,此时事务a再查询这张表,查询的结果则是事务b修改后的数据,这样事务a两次相同查询操作的返回结果却不同,也就是不可重复读。

可重复读 REPEATABLE READ

多次读取同一范围的数据会返回第一次查询的快照,不会返回不同的数据行,但是可能发生幻读(Phantom Read)。
比如说,先在事务a中查询空表,返回空;然后在事务a中向表中的主键列id添加值1并提交,再在事务a中查询该表,仍然返回空,也就是说可以重复读了。
但是,此时我们再在事务a中向表中id列插入1,则会出错,因为表中已经有id=1,然而我们读到地结果却是空,这就是幻读。

串行化 SERIALIZABLE

InnoDB 隐式地将全部的查询语句加上共享锁,解决了幻读的问题。

持久性(Durability)

再来了解ACDI特性的最后一个成员,持久性。持久性就是说事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务的使用

事务控制语句:

  • 开启一个事务 BEGINSTART TRANSACTION ;
  • 提交事务 COMMIT ,也可以使用 COMMIT WORK,二者是等价的;
  • 回滚事务 ROLLBACK 也可以使用 ROLLBACK WORK,二者是等价的;
  • SAVEPOINT identifierSAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT
  • RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
  • ROLLBACK TO identifier把事务回滚到标记点;
  • SET TRANSACTION 用来设置事务的隔离级别。

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认
    2、直接用 SET 来改变 MySQL 的自动提交模式:
  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

例子

BEGIN;

INSERT INTO student
     VALUES (13, '霉霉', 39, '女');
     
ROLLBACK;

SELECT * FROM student;

INSERT INTO student
     VALUES (13, '霉霉', 39, '女');
     
INSERT INTO score
      VALUE (5, 13, 1001, 99);

COMMIT;

因为ROLLBACK语句,上面代码中的查询student语句返回的结果没有id=13的记录:

ROLLBACK语句后,又进行了插入值的操作,再查看,发现均已成功添加:


MySQL默认的隔离等级为REPEATABLE-READ,不能脏读,可重复读,有可能会幻读。
现在开启两个事务举例。

在上一个例子中已经向student表中添加了id=13的记录,id为主键。
现在事务a中向student表再插入id=13的记录话,可想而知,会报错:

-- 事务a

BEGIN;

INSERT INTO score
      VALUE (6, 13, 1001, 99);

INSERT INTO student
     VALUES (13, '霉霉', 39, '女');
     
COMMIT;


再在事务a中查询score表:

-- 事务a
SELECT * FROM test.score;


再在事务b中查询score表:

-- 事务b
SELECT * FROM test.score;


可以发现,在事务b中查询score表的结果,没有id=6的记录,因为当前隔离等级不可脏读,也就是说事务a中的INSERT INTO score操作没有提交。这是因为后面student表的插值操作失败了,事务的原子性决定`score·表的差值操作也不会被提交。

在事务a中将studentid为1的学生的名字改为Mere:

-- 事务a
UPDATE student
   SET name = 'Mere'
 WHERE id = 13;


再在事务b中查询student表:

可以看到,事务b中该条记录没有被修改,这就是可重复读。

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

推荐阅读更多精彩内容

  • http://baijiahao.baidu.com/s?id=1581064626251873652&wfr=s...
    hekang01阅读 649评论 0 0
  • 来源转载自:http://www.cnblogs.com/ymy124/p/3718439.html MySQL的...
    Mrwangs阅读 1,951评论 0 8
  • 事务处理 事务处理是数据库中的一个大块头,涉及到数据的完整性与一致性问题,由于mysql存在多种数据存储引擎提供给...
    tanghomvee阅读 738评论 0 0
  • 在生活中,我们时常会遇到一系列连续不可中断的事情。例如会计记账时,有借必有贷,借贷必相等;又如从 ATM 取钱时,...
    Kerwong阅读 1,358评论 0 4
  • TCL: Transaction Control Language 事务控制语言 事务概念: 一条或一组 SQL ...
    指间Hrc阅读 1,784评论 0 0