mysql_事务隔离机制

事务隔离机制

事务就是要保证一组数据库操作,要么全部成功,要么全部失败。
在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;
如何避免长事务
问题

1.为什么可重复读这种隔离级别下,还是会出现幻读?

参考

极客时间《mysql实战45讲》

转载于:https://my.oschina.net/grace233/blog/2907396

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值