作者:微信小助手
发布时间:2023-05-09T15:55:19
事务,由一个有限的数据库操作序列构成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。 假如A转账给B 100 元,先从A的账户里扣除 100 元,再在 B 的账户上加上 100 元。如果扣完A的100元后,还没来得及给B加上,银行系统异常了,最后导致A的余额减少了,B的余额却没有增加。所以就需要事务,将A的钱回滚回去,就是这么简单。 事务的隔离级别有四种,分别是:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)。 Mysql默认的事务隔离级别是可重复读(RR)。 我们知道Mysql有四种数据库隔离级别,分别是读未提交、读已提交、可重复读、串行化。而读未提交隔离级别太低了,会有脏读问题,串行化隔离级别太高了,会影响并发读。那么就剩下读已提交(RC)和可重复读(RR)了。 那么,Mysql为什么会选择RR作为默认隔离级别呢? 我们的MySQL数据库一般都是集群部署的,会有主库、从库。主库负责写,从库负责读。主库写入之后,会进行主从复制,把数据同步到从库。 从库是在主库拿到bin log日志,并执行bin log,从而保证从库与主库的数据一致性。 实际上, MySQL官网上还记录了这个bug。 我们可以复现这个bug,假设有表结构如下: 插入两条数据 执行以下这两个事务: 执行完之后,因为
1. 什么是数据库事务?
2. 事务的四大特性
3. 事务的隔离级别有哪些?MySQL的默认隔离级别是什么?
4. Mysql为什么选择RR作为默认隔离级别?
bin log
有三种格式,分别是statement,row和mixed
。如果是statement
格式,bin log
记录的是SQL
的原文。Mysql早些时候,bin log
日志格式只有statement
这种,在RC的隔离级别,可能出现数据不一致的问题。
CREATE TABLE t (
a int(11) DEFAULT NULL,
b int(11) DEFAULT NULL,
KEY a (a)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;insert into t values(666,2),(233,1);