关键词:
事务
事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属性,称为原子性、一致性、隔离性和持久性 (ACID) 属性,只有这样才能成为一个事务。
事务并发
数据库是多个用户(事务)共享的,当多个用户同时访问数据时,那么在这种情况下就叫做并发。
事务并发下可能出现的问题
更新丢失
两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
脏读
一个事务读取到了另一个事务未提交的数据操作结果。这是相当危险的,因为很可能所有的操作都被回滚。
不可重复读
一个事务对同一行数据重复读取两次,但是却得到了不同的结果。
幻读
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同。
事务的隔离级别
读未提交
当前事务可以读取另一个事务未提交的记录,非常危险,因为另一个事务可能完全回滚!
读已提交
保证一个事务修改的数据提交后才能被另外一个事务读取。
可重复读
这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读!
序列化
事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
LBCC-隔离级别
读未提交
不加任何锁
读已提交
读数据加共享锁
更改数据加排他锁
共享锁读完立即释放
可重复读
读数据加共享锁
更改数据加排他锁
共享锁事务结束才释放
序列化
读数据加共享锁
更改数据加排他锁
共享锁事务结束才释放
增加范围锁
什么鬼?可重复读和读已提交两种隔离级别得出的结论跟LBCC协议不一致!!!怀疑人生中……
MVCC协议
MVCC–多版本并发控制协议
通过保存数据在某个时间点的快照来实现,也就是说,不管需要执行多长时间,每个事务看到的数据都是一致的。不同的存储引擎MVCC的实现是不同的,典型的有乐观并发控制和悲观并发控制。
MVCC实现原理(Innodb引擎)
Innodb引擎会为每一行添加两个隐藏的列来实现的,分别表示该行创建版本和删除版本,创建版本是事务的版本号,每开始一个新的事务,版本号会自动递增。
举个栗子,偷几张图...
初始化数据
事务1
事务2
读已提交
读事务每次都读取undo log中最近的版本,因此两次对同一字段的读可能读到不同的数据(幻读),但能保证每次都读到最新的数据
可重复读
每次都读取指定的版本,这样保证不会产生幻读,但可能读不到最新的数据
总结
-
对于许多SQL,隔离级别越高,InnoDB给记录集加的锁就越严格,产生锁冲突的可能性就越高,从而对并发事务处理性的影响也就越大。
-
因此我们在项目中,应该尽量使用较低的隔离级别,以减少锁争用的几率。
- InnoDB引擎尽量使用索引,防止锁表。
- 合理使用事务的大小,小事务发生锁冲突的几率也更小。
- 尽量使用相等条件,避免Next-key锁对并发插入的影响(gap锁)
参考
- 高性能Mysql
- 深入浅出Mysql
精通java事务编程-弱隔离级别之防止更新丢失(代码片段)
RC和快照隔离级别主要都是为解决只读事务遇到并发写时可以看到什么(虽然中间也涉及脏写),还没触及另一种情况:两个写事务并发,而脏写只是写并发的特例。写事务并发带来最着名的问题就是丢失更新... 查看详情
mysql原理篇之事务隔离级别和mvcc--13(代码片段)
Mysql原理篇之事务隔离级别和MVCC--13事前准备事务隔离级别事务并发执行遇到的问题SQL标准中的四种隔离级别MySQL中支持的四种隔离级别如何设置事务的隔离级别MVCC原理版本链ReadViewREADCOMMITTED——每次读取数据前都生成一个ReadView... 查看详情
事务-并发事务演示及隔离级别
--查看事务隔离级别select@@transaction_isolation;--设置事务隔离级别setsessiontransactionisolationlevelrepeatableread; 查看详情
精通java事务编程-弱隔离级别之已提交读
若两个事务不触及相同数据,即无数据依赖关系,则它们能安全并行运行。只有当:某事务读取由另一个事务同时修改的数据时或两个事务同时修改相同数据才会出现并发问题。并发BUG很难通过测试找到,因为这样的错误只有在... 查看详情
精通java事务编程-可串行化隔离级别之真串行
RC和快照隔离级别可防止某些竞争条件,但并非全部。一些棘手案例,如写偏斜和幻读,会发现可悲情况:隔离级别难理解,且不同DB实现不一(如RR含义天差地别)若检查应用层代码很难判断特定隔离级别下是否安全,尤其是大... 查看详情
精通java事务编程-弱隔离级别之快照隔离和可重复读
表面看,RC已满足事务所需的一切特征:支持中止(原子性),防止读取不完整的事务结果,并防止并发写的混乱。这点很关键!为我们的开发省去一大堆麻烦。但此隔离级别仍有很多地方可能产生并发错误。如图-6说明RC可能发... 查看详情
弱隔离级别&事务并发问题
介绍弱隔离级别为什么要有弱隔离级别如果两个事务操作的是不同的数据,即不存在数据依赖关系,则它们可以安全地并行执行。但是当出现某个事务修改数据而另一个事务同时要读取该数据,或者两个事务同时修改相同数据时... 查看详情
精通java事务编程-弱隔离级别之快照隔离和可重复读(代码片段)
表面看,RC已满足事务所需的一切特征:支持中止(原子性),防止读取不完整的事务结果,并防止并发写的混乱。这点很关键!为我们的开发省去一大堆麻烦。但此隔离级别仍有很多地方可能产生并... 查看详情
精通java事务编程-弱隔离级别之已提交读(代码片段)
若两个事务不触及相同数据,即无数据依赖关系,则它们能安全并行运行。只有当:某事务读取由另一个事务同时修改的数据时或两个事务同时修改相同数据才会出现并发问题。并发BUG很难通过测试找到,因为这... 查看详情
嵌套事务(而不是并发事务)的默认隔离级别是多少?
】嵌套事务(而不是并发事务)的默认隔离级别是多少?【英文标题】:Whatisthedefaultisolationlevelacrossnestedtransactions(insteadofconcurrentones)?【发布时间】:2019-04-2414:14:01【问题描述】:Spring有3种典型的嵌套事务传播:REQUIRED、NEW和NEST... 查看详情
事务的隔离级别和传播行为
一、什么是事务隔离 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 五个事务隔级别:lsolation的属性值1,default默认的事... 查看详情
事务并发传播性隔离级别(代码片段)
事务并发、传播性、隔离级别(重难点)导读:本节重点在于多线程并发环境下的事务处理、和数据库在并发环境下的表锁和行锁。案例:在新增图书的时候,肯定需要先新增作者。SpringMVC声明式事务事务分... 查看详情
事务并发事务隔离级别
不可重复读(NonrepeatableRead) 一个事务的两次读取中,读取相同的资源得到不同的值。当事务T2在事务T1的两次读取之间更新数据,则会发生此种错误(重点在修改) 幻读(Phantom): 此概念相对难理解一些... 查看详情
图解数据库事务的隔离级别(代码片段)
...?我在网上所能找到的答案,帮助个人的理解。答案一:事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制,来解决并发问题。锁是数据库并发控制的内部机制,是基础。对用户来说,只... 查看详情
事务的特性和隔离级别
事务特性原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之&nbs... 查看详情
精通java事务编程-可串行化隔离级别之真串行
RC和快照隔离级别可防止某些竞争条件,但并非全部。一些棘手案例,如写偏斜和幻读,会发现可悲情况:隔离级别难理解,且不同DB实现不一(如RR含义天差地别)若检查应用层代码很难判断特定隔离... 查看详情
由事务隔离级别分隔的并发进程死锁
】由事务隔离级别分隔的并发进程死锁【英文标题】:deadlockonconcurrentprocessesseparatedbytransactionisolationlevel【发布时间】:2011-08-2313:36:05【问题描述】:我们有一个工单表。服务器代理作业从游标中的该表中获取100个条目并执行一... 查看详情
事务隔离级别
事务隔离级别 数据库并发操作存在的异常情况:1.更新丢失(Lostupdate): 两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操... 查看详情