`
eric_weitm
  • 浏览: 235940 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql事物隔离与死锁

    博客分类:
  • java
 
阅读更多

一、事物

0、事物的ACID:原子性、一致性、隔离性(不受干扰)、持久性(提交后不可回滚)

1、对数据库的所有操作,内部全部封装成事物(transaction)来运行。事物要满足ACID特性,数据库的恢复和管理全部基于事物。

2、数据库内的数据是所有人共享的,为了保证事物的ACID特性,必须在事物之间进行同步

3、最安全的同步策略是事物之间串行执行,但是效率最低、并发度最低,所以都会使用并发的方式

4、并发调度执行时,导致数据不一致。类型包括:

1》 丢失修改(Lost Update)2》 读“脏”数据(Dirty Read):事物结束前,别的事物回滚了所读的数据

3》 不可重复读(Non-repeatable Read) 事物结束前,有别的事物改数据

4》 幻读:事物结束前,有别的事物插入和删除

5、数据库内部保证事物隔离性的方式,加锁

1》写锁(排斥所有别的)、2》读锁 别的事物只能加读锁

6、锁的粒度

物理层面:页(索引或数据)、记录

逻辑:属性值 属性值集 元组 表 库 索引项 索引 

7、加锁的影响

活锁:一直没有获取到锁 ,(解决方案,先来先服务)

死锁:循环依赖

8、乐观锁

类似于内核的自旋锁

 

概括:事务并发-- 数据不一致/死锁

 

 

二、mysql的事物隔离级别(不影响写,影响读的行为),默认是可重复度,oracle默认是读已提交

事物本身并发执行,为了提高吞吐率,一定程度上牺牲了隔离性。

1、mysql提供的事物隔离级别

1》 读未提交(read-uncommitted) 2》 不可重复读(read-committed) 3》 可重复读(repeatable-read) 4》 串行化(serializable)

2、不同并发级别DMS隐含加的锁

    1》 读未提交 写事物没有锁住行到结束(允许此事物结束前,别的事物来读这一行) 2》 RC 写事物锁住一行到结束,但是当前读事物,读完之后没有锁住行(允许别的事物在此读事物结束前修改此行) 3》 RR 读事物一开始就锁行,一直到事物结束(不允许别的事物更改)。因为没有锁表,所以别的事物可以删除和插入新的行。

   4》串行 读事物直接锁住表。在此读事物结束前,整个表都不允许别的事物写。

3、内部实现

写加悲观锁

读使用缓存来模拟乐观锁

每个connection内传上来的事物都是一起进行事物调度的,不区分是否是一个应用程序内的 

 

三、RC级别事物隔离的问题

1、数据不一致

本事物内数据可能被修改多次,所以当写依赖读时,会产生问题。

触发条件:一个事物内,先读后写,并且读的结果作为条件,这个时候就会产生问题

解决方案:1》java代码里使用分布式锁,进行资源的锁定 2》事物执行完之后,java代码里加个查询检查条件是否变化。

2、死锁

innodb写的时候加悲观锁,所以多个事物并发时会有死锁的可能性。

3、可能死锁的原因和解决方案

1》 A和B 操作2张表,但是顺序相反,结果产生循环依赖。解决方案:涉及多表操作时,保持一样的顺序

2》 A查询一条纪录,然后修改该条纪录;在修改之前,用户B修改该条纪录,这时A的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升到独占锁也就不可能释放共享锁,于是出现了死锁。简单说,B等A释放,结果A因为B排在前面得不到排它锁,反而释放不了,导致死锁。

解决方案:按钮点击后改变状态,不要一个事物有很多副本在运行(自己锁住自己)

3》 不满足条件的update和delete等导致全表扫描情况出现时,容易导致循环依赖。解决方案:干掉全表扫描(尽量干掉join),加索引,查询条件尽量能定位到行

4》事物太长容易引起循环依赖。解决方案:变成短事物。

 

四、jdbc逻辑

1、jdbc 默认是 autocommit,每条sql一个单独的事物(永远不会死锁),但是需要多个操作保持一致性时,需要把多个操作放入一个事物中。

2、spring的事物传播机制默认是 PROPAGATION_REQUIRED:外层有了,内层就不起作用了

3、加悲观锁的方式,在语句后面添加 for update,例如 select * from t_user for update;

五、总结

写操作加锁不会导致不一致,但是会导致死锁。读操作可能不满足强一致性,事物隔离级别的本质是容忍哪种程度的读不一致。

 

分享到:
评论

相关推荐

    MySQL 事务(五).pdf

    事务隔离级别:介绍不同隔离级别及其对并发事务的影响。 锁机制:探讨MySQL中的锁类型和锁争用问题。 死锁处理:如何识别和解决事务中的死锁问题。 事务日志:事务日志的作用和恢复机制。 批量操作和事务:在执行...

    【面试高频!】数据库事务/事务的作用/数据库事务ACID属性 / 特性/事务的隔离性/数据库事务隔离级别/ 数据库的隔离级别导致问题/数据库事务的使用/mysql的事务死锁/ 快速解决mysql死锁问

    2:事务与事务之间互不干扰,这样数据会更加安全 数据库事务ACID属性 / 特性 原子性(Atomicity):要么全部完成,要么全部不完成。 一致性(Consistency):事务必须始终保持系统处于一致性。 隔离性(Isolation):隔离...

    mysql中的事务、锁讲解和操作

    在这里,我们通过对MySQL事务和锁的分类进行深入的研究,来帮助开发人员更好地了解和应用这些基础的数据库概念。 关于MySQL的事务,我们会深入探讨事务的定义、ACID属性、事务的相关隔离级别以及事务的执行流程等...

    MySQL Innodb表导致死锁日志情况分析与归纳

    案例描述在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志。两个sql语句如下:(1)insert into backup_table select * from source_table...

    MySQL死锁的产生原因以及解决方案

    在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁...

    MySQL的Innodb中的事务隔离级别和锁的关系

     我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以...

    MySQL死锁、锁、索引相关资料整理

    一次MySQL更新操作导致死锁问题的处理过程: MySQL更新使用二级索引字段导致死锁问题分析,https://blog.csdn.net/a82514921/article/details/104616763 1. MySQL文档说明 1.1 InnoDB死锁 ...

    最新mysql面试题整理大厂必备,你能答对几个?

    15.MySQL 中有几种事务隔离级别?分别是什么? 16.如何设置 MySQL 的事务隔离级别? 17.MySQL 出现了中文乱码该如何解决? 18.InnoDB 为什么要使用 B+ 树,而不是 B 树、Hash、红 黑树或二叉树? 19.MySQL 是如何...

    MySQL数据库:锁定与解锁.pptx

    数据库编程 锁定与解锁 课程目标 ...否则,MySQL会在调用 LOCK TABLES之后立刻释放表锁定,并且很容易形成死锁。 事务隔离级别 【例】 在XS表上设置一个只读锁定。 LOCK TABLES XS READ; 说明:LOCK TABLE

    新版 MySQL DBA 高级视频 基于MySQL 5.7 MySQL 8.0版本.rar

    │ 4_InnoDB事务隔离级别详解.mp4 │ 5_InnoDB死锁发生原理和规避.mp4 │ 6_MySQL字符集和排序规则.mp4 │ 作业.docx │ 锁等待分析.txt │ ├─新版MySQL DBA综合实战班 第08天 │ 1_课堂作业讲解.mp4 │ 2_MySQL...

    10道精选MySQL面试题

    解释不同事务隔离级别的含义以及可能导致的问题(脏读、不可重复读、幻读),并指出MySQL的默认隔离级别是什么。 当表数据量很大时,如何进行SQL查询优化以提高查询效率? 如何设计合适的索引来改善特定查询语句的...

    mysql面试题100题,包含答案和解析.docx

    mysql面试题,包含总共100题,并且附带详细答案和...16、MySQL事务得四大特性以及实现原理 17、如果某个表有近千万数据,CRUD比较慢,如何优化。 18、如何写sql能够有效的使用到复合索引。 19、mysql中in 和exists的

    MySQL技术内幕 InnoDB存储引擎.pdf

    6. 锁 - 实现事务的隔离性 6.1 什么是锁 6.2 lock和latch 6.3 InnoDB存储引擎中的锁 6.4 锁的算法 6.5 锁问题 6.6 阻塞 6.7 死锁 6.8 锁升级 7. 事务 7.1 概述 7.2 事务的实现 7.3 事务控制语句 7.4 ...

    SQL Server数据库事务锁的机制分析

    深入介绍了SQL Server的锁的机制,锁与事务隔离等级的关系及影响,分析了死锁的案例和解决方案。提出了锁的性能分析方法,分析并发性阻塞的问题和应用技巧。

    MySQL之锁和事务

    目录一、锁分类死锁二、事务事务特性隔离级别多版本并发控制MVCC 一、锁 分类 Mysql为了解决并发、数据安全的问题,使用了锁机制。可以按照锁的粒度把数据库锁分为表级锁和行级锁。 表级锁 对当前操作的整张表加锁,...

    基于分布式事务RT模式实现适用于hyperf框架的组件源码.zip

    1. 开箱即用,不需要重构原有项目的代码,与mysql事务写法一致,简单易用。 2. 两段提交的强一致性事务,高并发下,支持读已提交的事务隔离级别,数据一致性100%接近mysql xa。 3. 性能超过seata AT模式,由于事务...

    MySQL面试题(记得被问过的一些题目)

    char和varchar两种数据类型的区别与适用场景? 关联查询INNER JOIN、LEFT JOIN 、RIGHT JOIN的区别与适用场景? 索引分类? 索引区别? 什么是MySQL的锁机制? 什么是乐观锁和悲观锁?...事务的隔离级别与适用场景?

    mysql存储过程事务管理简析

    1,MySQL的事务支持 1)MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: Sql代码 代码如下: MyISAM:不支持事务,用于只读程序提高性能 InnoDB:支持ACID事务、行级锁、并发 Berkeley DB:支持...

    一次Mysql死锁排查过程的全纪录

    虽然是后端程序员,我们不需要像DBA一样深入地去分析与锁相关的源码,但是如果我们能够掌握基本的死锁排查方法,对我们的日常开发还是大有裨益的。 PS:本文不会介绍死锁的基本知识,mysql的加锁原理可以参考本文的...

    MySQL的事务与锁解析

    隔离级别的实现五、死锁1. 锁的释放和阻塞2. 死锁的发生和检测3. 查看锁的信息4. 死锁的避免 一、什么是事务 1. 使用场景 项目里面,比如有涉及到转账、操作订单之类的,我们需要让这些操作在一个事务里面

Global site tag (gtag.js) - Google Analytics