一、事物
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中的锁类型和锁争用问题。 死锁处理:如何识别和解决事务中的死锁问题。 事务日志:事务日志的作用和恢复机制。 批量操作和事务:在执行...
2:事务与事务之间互不干扰,这样数据会更加安全 数据库事务ACID属性 / 特性 原子性(Atomicity):要么全部完成,要么全部不完成。 一致性(Consistency):事务必须始终保持系统处于一致性。 隔离性(Isolation):隔离...
在这里,我们通过对MySQL事务和锁的分类进行深入的研究,来帮助开发人员更好地了解和应用这些基础的数据库概念。 关于MySQL的事务,我们会深入探讨事务的定义、ACID属性、事务的相关隔离级别以及事务的执行流程等...
案例描述在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志。两个sql语句如下:(1)insert into backup_table select * from source_table...
在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁...
我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以...
一次MySQL更新操作导致死锁问题的处理过程: MySQL更新使用二级索引字段导致死锁问题分析,https://blog.csdn.net/a82514921/article/details/104616763 1. MySQL文档说明 1.1 InnoDB死锁 ...
15.MySQL 中有几种事务隔离级别?分别是什么? 16.如何设置 MySQL 的事务隔离级别? 17.MySQL 出现了中文乱码该如何解决? 18.InnoDB 为什么要使用 B+ 树,而不是 B 树、Hash、红 黑树或二叉树? 19.MySQL 是如何...
数据库编程 锁定与解锁 课程目标 ...否则,MySQL会在调用 LOCK TABLES之后立刻释放表锁定,并且很容易形成死锁。 事务隔离级别 【例】 在XS表上设置一个只读锁定。 LOCK TABLES XS READ; 说明:LOCK TABLE
│ 4_InnoDB事务隔离级别详解.mp4 │ 5_InnoDB死锁发生原理和规避.mp4 │ 6_MySQL字符集和排序规则.mp4 │ 作业.docx │ 锁等待分析.txt │ ├─新版MySQL DBA综合实战班 第08天 │ 1_课堂作业讲解.mp4 │ 2_MySQL...
解释不同事务隔离级别的含义以及可能导致的问题(脏读、不可重复读、幻读),并指出MySQL的默认隔离级别是什么。 当表数据量很大时,如何进行SQL查询优化以提高查询效率? 如何设计合适的索引来改善特定查询语句的...
mysql面试题,包含总共100题,并且附带详细答案和...16、MySQL事务得四大特性以及实现原理 17、如果某个表有近千万数据,CRUD比较慢,如何优化。 18、如何写sql能够有效的使用到复合索引。 19、mysql中in 和exists的
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的锁的机制,锁与事务隔离等级的关系及影响,分析了死锁的案例和解决方案。提出了锁的性能分析方法,分析并发性阻塞的问题和应用技巧。
目录一、锁分类死锁二、事务事务特性隔离级别多版本并发控制MVCC 一、锁 分类 Mysql为了解决并发、数据安全的问题,使用了锁机制。可以按照锁的粒度把数据库锁分为表级锁和行级锁。 表级锁 对当前操作的整张表加锁,...
1. 开箱即用,不需要重构原有项目的代码,与mysql事务写法一致,简单易用。 2. 两段提交的强一致性事务,高并发下,支持读已提交的事务隔离级别,数据一致性100%接近mysql xa。 3. 性能超过seata AT模式,由于事务...
char和varchar两种数据类型的区别与适用场景? 关联查询INNER JOIN、LEFT JOIN 、RIGHT JOIN的区别与适用场景? 索引分类? 索引区别? 什么是MySQL的锁机制? 什么是乐观锁和悲观锁?...事务的隔离级别与适用场景?
1,MySQL的事务支持 1)MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: Sql代码 代码如下: MyISAM:不支持事务,用于只读程序提高性能 InnoDB:支持ACID事务、行级锁、并发 Berkeley DB:支持...
虽然是后端程序员,我们不需要像DBA一样深入地去分析与锁相关的源码,但是如果我们能够掌握基本的死锁排查方法,对我们的日常开发还是大有裨益的。 PS:本文不会介绍死锁的基本知识,mysql的加锁原理可以参考本文的...
隔离级别的实现五、死锁1. 锁的释放和阻塞2. 死锁的发生和检测3. 查看锁的信息4. 死锁的避免 一、什么是事务 1. 使用场景 项目里面,比如有涉及到转账、操作订单之类的,我们需要让这些操作在一个事务里面