文档章节

mysql_事务隔离机制

grace_233
 grace_233
发布于 11/22 18:01
字数 817
阅读 15
收藏 0

事务隔离机制

事务就是要保证一组数据库操作,要么全部成功,要么全部失败。
在mysql中,事务支持是在引擎层实现的。

mysql是一个支持多引擎的系统,但并不是所有引擎都支持事务,比如mysql原生的MyISAM就不支持事务。这也是MyISAM被innoDB取代的重要原因。

隔离性与隔离级别

事务的四个特性: ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性). 这里重点讨论隔离性。

关于串行化的串行提交

关于串行化的串行提交:
串行化:通过读写锁来避免并行访问。
读-读:允许并发执行
读-写: 貌似也能并发执行。因此读的那个事务中读的是已提交的内容。
写-写:只能串行

什么时候需要"可重复读"的场景呢

假设你在管理一个个人银行账户表。一个表存了每个月月底的余额,一个表存了账单明细。这时候你要做数据校对,也就是判断上个月的余额和当前余额的差额,是否与本月的账单明细一致。你一定希望在校对过程中,即使有用户发生了一笔新的交易,也不影响你的校对结果。

这时候使用“可重复读”隔离级别就很方便。事务启动时的视图可以认为是静态的,不受其他事务更新的影响。

事务隔离的实现

以可重复读为例,来看事务隔离的具体实现。

TODO:这里面MVCC机制和undo log到底是什么关系我有点懵。貌似其实是undo log就是innodb 中MVCC机制的具体实现。大概是这么个意思吧。

事务的启动方式

MySQL 的事务启动方式有以下几种:

1. 显式启动事务语句: begin 或 start transaction.配套的提交语句是 commit,回滚语句是 rollback.
2. set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。
有些客户端连接框架会默认连接成功后先执行一个 set autocommit=0 的命令。这就导致接下来的查询都在事务中,如果是长连接,就导致了意外的长事务。建议你总是使用 set autocommit=1, 通过显式语句的方式来启动事务。

你可以在 information_schema 库的 innodb_trx 这个表中查询长事务。

-- 查找持续时间超过 60s 的事务
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;

如何避免长事务

参考

极客时间《mysql实战45讲》

© 著作权归作者所有

共有 人打赏支持
grace_233
粉丝 5
博文 58
码字总数 25197
作品 0
浦东
程序员
私信 提问
mysql乱七八糟的可重复读隔离级别实现

mysql的隔离级别并非是按照标准实现的,作为从pg切过来的程序员还真是不太适应,这篇文章讨论mysql隔离级别实现的,希望对大家能有帮助。 什么是事务 事务是数据库一组读写操作的集合,事务具...

徐文韬
2017/09/11
0
0
mysql 开发进阶篇系列 6 锁问题

一.概述   在数据库中,数据是属于共享资源,为了保证并发访问的一致性,有效性,产生了锁。接下来重点讨论mysql锁机制的特点,常见的锁问题,以及解决mysql锁问题的一些方法或建议。 相比...

花阴偷移
07/23
0
0
MySQL MVCC && 事务隔离级别 && 锁

MySQL MVCC && 事务隔离级别 && 锁 InnoDB多版本并发控制——MVCC http://my.oschina.net/xinxingegeya/blog/208821 MySQLS锁X锁read lockwrite lock http://my.oschina.net/xinxingegeya/bl......

秋风醉了
2014/07/30
0
0
数据库事务隔离级别(面试题 )

今天请了一天假去卓望公司面试,被问到数据库隔离机制的问题,真的没准备,平时的工作用到的也不多,数据库默认机制是啥也没怎么关心,回来看了点资料,打开mysql测试了一下,终于清楚了!总结...

在水一方发盐人
2016/11/11
96
0
mysql事务和锁 SELECT FOR UPDATE

事务: 当然有的人用begin /begin work .推荐用START TRANSACTION 是SQL-99标准启动一个事务。 当用set autocommit = 0 的时候,你以后所有的sql都将作为事务处理,直到你用commit确认或 ro...

SibylY
2016/08/22
172
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq学习

使用docker安装rabbit docker run -d --hostname my-rabbit --name rabbit -p 8080:15672 rabbitmq:management--hostname:指定容器主机名称--name:指定容器名称-p:将mq端口号映射到本地...

元谷
17分钟前
0
0
想知道谁是你的最佳用户?基于Redis实现排行榜周期榜与最近N期榜

本文由云+社区发表 前言 业务已基于Redis实现了一个高可用的排行榜服务,长期以来相安无事。有一天,产品说:我要一个按周排名的排行榜,以反映本周内用户的活跃情况。于是周榜(按周重置更新...

腾讯云加社区
19分钟前
1
0
函数计算性能福利篇(二) —— 业务冷启动优化

继前一篇《函数计算性能福利篇——系统冷启动优化》,我们再来看看近期函数计算推出的 Initializer 功能之后,带来的一波高能性能优化成果。 背景 函数计算是一个事件驱动的全托管 serverle...

阿里云官方博客
25分钟前
1
0
开源版本说明

1527
27分钟前
2
0
Mysql经验-------持续更新

单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。 说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

DoLo-lty
29分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部