数据库并行产生的问题

  1. A事务撤销时,将B事务更改的数据撤销。
  2. A事务提交时,将B事务更改的同行数据覆盖。
  3. 脏读:A事务读取到了B事务未提交的数据。
  4. 不可重复读:A事务中同查询语句不幂等,读到已更新数据。
  5. 幻读:A事物中同查询语句不幂等,读到新插入数据。

数据库事务隔离级别

  1. 串行化(Serializable):一个事务执行过程中完全看不到其他事务,但如果其他事务在操作,只能停等;可避免以上五个问题。
  2. 可重复读(Repeated Read, RR):一个事务可以看到其他事务已提交的新插入记录,但不能看到其他事务对已有行的更新记录;允许幻读。
  3. 读已提交数据(Read Committed, RC):一个事务可以看到其他事务已提交的记录,包括插入和更新;允许幻读和不可重复读。
  4. 读未提交(Read Uncommited):一个事务可以看到其他事务未提交的数据;仅能避免A事务撤销影响B事务。

InnoDB中的事务实现

MySQL的引擎是innoDB时,使用的默认隔离级别为,可重复读(RR级);大部分数据库使用的默认隔离级别为读已提交(RC级)。

实现RC级的事务时,仅需要采用行锁。InnoDB的行锁采用乐观锁的形式实现事务,InnoDB在每行数据后加入两个字段:创建版本号,删除版本号,在事务为默认的RR级以及RC级时,InnoDB事务隔离实现如下:

  • select 读取版本号<=当前事务版本号,删除版本号为空或大于当前事务版本号。
  • insert 保存当前事务版本号为行的创建版本号。
  • delete 保存档前事务版本号为行的删除版本号。
  • update 插入一条新的记录,保存当前事务版本号为行的创建版本号,同时保存当前事务版本号到原来的行。

需要注意的是,基于上述原理,mysql事务级别为可重复读时,select操作的结果不会有幻读记录,实际上,这是因为mysql的select是一种“快照读”,而非“当前读”。因此,事务为RR级和RC级时,mysql的select是不需要加锁的,但一旦涉及到insert/update/delete,则需要当前读,就需要加锁。

MySQL事务使用了Next-Key锁,Next-Key锁是行锁和间隙锁的合并。行锁负责给操作行加锁,在RC级中,使用行锁已经足够。而间隙锁,则基于数据作为索引结构的B+树,将数据所在块的邻接块一同加锁,因此可能会锁住不必要的区间,如果不使用索引,则会给全表加锁。

需要注意的是级别是串行的话,即便是select操作也是加锁的。

参考文献

Innodb中的事务隔离级别和锁的关系
数据库事务隔离级别

常见问题:MySQL/事务隔离的更多相关文章

  1. [51CTO]新说MySQL事务隔离级别!

    新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...

  2. 查询mysql事务隔离级别

    查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava   1.查看当前会话隔离 ...

  3. MySQL事务隔离级别测试实例

    https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...

  4. Mysql事务-隔离级别

    MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...

  5. MySQL事务隔离级别 解决并发问题

    MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...

  6. mysql事务隔离级别、脏读、幻读

    Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...

  7. mysql事务隔离级别与设置

    mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...

  8. MySQL事务隔离级别(二)

    搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...

  9. MySQL事务隔离级别(一)

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

随机推荐

  1. COM Error Code(HRESULT)部分摘录

    Return value/code Description 0x00030200 STG_S_CONVERTED The underlying file was converted to compou ...

  2. 8-3编码器,3-8译码器的verilog实现

    在数字系统中,由于采用二进制运算处理数据,因此通常将信息变成若干位二进制代码.在逻辑电路中,信号都是以高,低电平的形式输出.编码器:实现编码的数字电路,把输入的每个高低电平信号编成一组对应的二进制代码 ...

  3. 【论文阅读】DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation

    DCAN: Deep Contour-Aware Networks for Accurate Gland Segmentation 作者:Hao Chen Xiaojuan Qi Lequan Yu ...

  4. css去除图片间隙

    问题如下图 把图片转换成块状元素即可 .img{ display: block; } 解决后:

  5. SELECT INTO (insert into) 和 INSERT INTO SELECT (insert into select) 两种表复制语句

    1.INSERT INTO SELECT语句   语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from T ...

  6. sysfs 控制gpio

    按照下面的命令点亮及熄灭LED pi@raspberrypi:/sys/class/gpio $echo 26 > exportpi@raspberrypi:/sys/class/gpio $ ...

  7. 完美解决: org.apache.ibatis.binding.BindingException Invalid bound statement (not found)

    异常描述: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 原因: springboot ...

  8. Dynamic Filter Networks

    Dynamic Filter Networks 2019-06-10 11:29:19 Paper:http://papers.nips.cc/paper/6578-dynamic-filter-ne ...

  9. linux下apache安装ssl步骤

    制作证书: 参考:linux下运用opensll制作ssl证书 生成三个证书 server.crt .server-ca.crt.server.key 安装openssl tar -xzvf open ...

  10. Java基础 return 退出main方法的示例

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...