1、什么是事务

事务是一条或多条数据库操作语句的组合,具备ACID,4个特点。

原子性:要不全部成功,要不全部撤销

隔离性:事务之间相互独立,互不干扰

一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏

持久性:事务的提交结果,将持久保存在数据库中

后期文章会首发于本专栏,也会不定时发放福利 ,欢迎关注,点赞

JAVA高级进阶​zhuanlan.zhihu.com

2、事务并发会产生什么问题

1)第一类丢失更新:在没有事务隔离的情况下,两个事务都同时更新一行数据,但是第二个事务却中途失败退出, 导致对数据的两个修改都失效了。

例如:

张三的工资为5000,事务A中获取工资为5000,事务B获取工资为5000,汇入100,并提交数据库,工资变为5100,

随后

事务A发生异常,回滚了,恢复张三的工资为5000,这样就导致事务B的更新丢失了。

2)脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

例如:

  张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。

  与此同时,

  事务B正在读取张三的工资,读取到张三的工资为8000。

  随后,

  事务A发生异常,而回滚了事务。张三的工资又回滚为5000。

  最后,

  事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。

3)不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

例如:

在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。

与此同时,

事务B把张三的工资改为8000,并提交了事务。

随后,

在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。

4)第二类丢失更新:不可重复读的特例。有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成第一次写操作失效。

例如:

在事务A中,读取到张三的存款为5000,操作没有完成,事务还没提交。

与此同时,

事务B,存储1000,把张三的存款改为6000,并提交了事务。

随后,

在事务A中,存储500,把张三的存款改为5500,并提交了事务,这样事务A的更新覆盖了事务B的更新。

5)幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

例如:

目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。

此时,

事务B插入一条工资也为5000的记录。

这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。

提醒:

不可重复读的重点是修改,同样的条件,你读取过的数据,再次读取出来发现值不一样了

幻读的重点在于新增或者删除,同样的条件,第 1 次和第 2 次读出来的记录数不一样

3、事务隔离级别,解决什么并发问题,以及存在什么并发问题

(1)READ_UNCOMMITTED

 这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。

 解决第一类丢失更新的问题,但是会出现脏读、不可重复读、第二类丢失更新的问题,幻读 。

(2)READ_COMMITTED

保证一个事务修改的数据提交后才能被另外一个事务读取,即另外一个事务不能读取该事务未提交的数据。

解决第一类丢失更新和脏读的问题,但会出现不可重复读、第二类丢失更新的问题,幻读问题

(3)REPEATABLE_READ

保证一个事务相同条件下前后两次获取的数据是一致的

解决第一类丢失更新,脏读、不可重复读、第二类丢失更新的问题,但会出幻读。

(4)SERIALIZABLE

事务被处理为顺序执行。

解决所有问题

提醒:

Mysql默认的事务隔离级别为repeatable_read

4、InnoDB引擎的锁机制

(之所以以InnoDB为主介绍锁,是因为InnoDB支持事务,支持行锁和表锁用的比较多,Myisam不支持事务,只支持表锁)

共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。

意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

说明:

1)共享锁和排他锁都是行锁,意向锁都是表锁,应用中我们只会使用到共享锁和排他锁,意向锁是mysql内部使用的,不需要用户干预。

2)对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁,事务可以通过以下语句显示给记录集加共享锁或排他锁。

共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。

排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。

3)InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

我这儿整理了比较全面的JAVA相关的面试资料,

需要领取面试资料的同学,请加群:473984645

mysql 并发_Mysql事务,并发问题,锁机制相关推荐

  1. 【MySQL进阶】MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!)

    [MySQL进阶]MySQL事务隔离与锁机制底层原理万字总结(建议收藏!!) 参考资料: 美团技术团队:Innodb中事务隔离级别和锁的关系 数据库的锁,到底锁的是什么? 阿里面试:说说一致性读实现原 ...

  2. 徐无忌并发编程笔记:无锁机制CAS及其底层实现原理?

    徐无忌并发编程笔记:无锁机制CAS及其底层实现原理? 完成:第一遍 1.什么是CAS算法? compare and swap:比较与交换,是一种有名的无锁算法 CAS带来了一种无锁解决线程同步,冲突问 ...

  3. 深入理解并发编程之CAS无锁机制与ABA问题

    深入理解并发编程之CAS无锁机制与ABA问题 文章目录 深入理解并发编程之CAS无锁机制与ABA问题 前言 一.什么是CAS无锁机制 二.CAS原理分析 1.AtomicLong自增分析 2.基于At ...

  4. mysql 事务操作与锁机制

    mysql 事务操作与锁机制

  5. 带你了解什么是MySQL数据库(八)数据库锁机制

    目录 数据库的锁机制 锁的分类 MySQL中的行级锁,表级锁,页级锁(粒度) 行级锁之共享锁与排他锁(级别) innodb存储引擎的锁机制 行级锁与表级锁区分 三种行锁算法 死锁问题 什么时候使用表锁 ...

  6. MySQL基础篇(06):事务管理,锁机制案例详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.锁概念简介 1.基础描述 锁机制核心功能是用来协调多个会话中多线程并发访问相同资源时,资源的占用问题.锁机制是一个非常大的模块,贯彻MyS ...

  7. mysql事务所_mysql事务

    1.事务的ACID属性 事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资 ...

  8. mysql提交事务_mysql事务的实现原理

    此篇文章算是对mysql事务的一个总结,基本把mysql事务相关的知识点都涵盖到了,面试问来问去无非也就是这些,在了解这些之前我们先对mysql在执行的过程中有一个整体的认识,如下图 如上图所示,My ...

  9. mysql级别_mysql事务级别

    一.隔离级别 隔离级别(Isolation Level) SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并 ...

最新文章

  1. Android SDK安装找不到JDK
  2. 看看HashSet源码
  3. SQL Server 数据库巡检脚本
  4. django filter查询多选_Django:使用filter的pk进行多值查询操作
  5. FullCalendar插件月视图正常显示周视图不正常显示问题解决方法
  6. 【算法分析与设计】海盗分硬币问题
  7. 【人脸识别】arcface详解
  8. 使用 .NET 平台,如何玩转 Universal Windows 应用? 1
  9. RTI_DDS自定义插件开发 4 接收方
  10. ssh登录工具 putty 和 生成.ppk文件的puttygen工具 如何使用puttygen生成密钥
  11. 如何看旷视南京负责人魏秀参跳槽高校工作?
  12. 新版虚拟服务器,新版tplink路由器虚拟服务器(端口映射)设置教程
  13. 黑马程序员python15期月薪_2019年传智播客黑马python人工智能15期全套视频教程
  14. CRC_8循环冗余校验码verilog实现
  15. JAVA_判断日期是否为工作日(排除节假日和调整周末上班)
  16. 计算机专业文书范文,美国留学文书技巧-美国计算机专业博士的申请个人陈述范文...
  17. 【游戏开发Unity】捏脸系统(附源码)
  18. lsnrctl 未找到命令
  19. Android设置app显示指定国家语言
  20. 骑行运动耳机哪个好,骑行听歌必备的几款运动耳机推荐

热门文章

  1. CALL FUNCTION START NEW TASK
  2. 构造函数= default;_Python Collections之defaultdict 和 default_factory关系
  3. ppp协议pap验证过程状态转移图_电脑网络知识:TCP协议的高级特性,你所不知道的TCP...
  4. 关于pandas绘制图片不显示问题
  5. 如何使用facenet详解_如何使用冰箱更节能 使用冰箱节能技巧介绍【详解】
  6. consul php,go-micro+php+consul实现简单的微服务
  7. iview 级联选择组件_vue组件递归渲染实例
  8. php科学计算库,科学计算库numpy基础
  9. Android 实现扑克牌动画,android – 重叠图像(扑克牌)
  10. matlab watershed函数简单实现_函数指针方法实现简单状态机(附代码)