`
eric_weitm
  • 浏览: 242676 次
  • 性别: 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死锁解决

    本文将详细介绍MySQL中的死锁现象、其产生的原因以及如何有效地检测与解决死锁问题。 #### 一、死锁定义 死锁是指两个或两个以上的事务在执行过程中,由于每个事务都持有某些资源且又都在等待其他事务释放其持有的...

    mysql死锁的一些案例

    二是设置合适的事务隔离级别和超时时间,让系统自动处理。 3. **预防死锁的策略**: - 设计合理的数据访问顺序:确保事务按照同一顺序获取资源,减少死锁的可能性。 - 使用更细粒度的锁:行级锁相对于表级锁可以...

    mysql死锁分析

    在InnoDB中,`DELETE`操作会根据当前的事务隔离级别和查询条件的不同而采取不同的加锁策略。在`RR`(Repeatable Read)隔离级别下,`DELETE`操作默认使用`nextkey lock`来锁定目标记录及其之前的间隙,以防其他事务...

    一个最不可思议的MySQL死锁分析1

    事务隔离级别设定为RR(Repeatable Read)。每个事务执行的SQL语句是基于这个唯一索引删除一条记录。理论上,由于每个事务只删除一条记录,不应该出现死锁,但实际情况恰恰相反。 在初步分析中,发现死锁涉及的两个...

    mysql-一些常见的mysql死锁案例-笔记记录.zip

    首先,我们要理解MySQL中的事务隔离级别,这与死锁有直接关系。MySQL支持四种隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。在可...

    MySQL REPLACE死锁问题深入剖析1

    MySQL支持四种事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ(RR)和SERIALIZABLE。在READ COMMITTED级别,每次查询只能看到已经提交的事务,理论上允许INSERT操作并发执行。然而,如果表中有...

    几种不常见的MySQL InnoDB 死锁情况--1

    4. 考虑使用更宽松的事务隔离级别,如可重复读(Repeatable Read)降级为读已提交(Read Committed)。 5. 在应用程序中实现死锁的预防策略,如加锁顺序的规范化。 通过理解这些不常见的死锁情况,开发者可以更好地...

    mysql innodb死锁问题详解.docx

    2. 检查隔离级别:查看数据库的事务隔离级别,包括Read Uncommitted、Read Committed、Repeatable Read和Serializable。不同的隔离级别会影响事务的并发行为,可能导致锁冲突。 3. 分析线程状态:使用`SHOW FULL ...

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

    6. **设置事务隔离级别**:通过调整事务的隔离级别,如READ COMMITTED或REPEATABLE READ,可以在一定程度上避免死锁。 7. **死锁检测与回滚**:MySQL数据库自身具备死锁检测机制,当检测到死锁时,会自动回滚其中一...

    【课堂笔记】MySQL事务与锁详解.pdf

    MySQL事务与锁详解的知识点如下: 1. 事务的理解与应用场景: 事务是数据库管理系统(DBMS)执行过程中的逻辑单位,是一个不可分割的工作单元,可以包含一条或多条DML语句。在实际应用中,事务常见的使用场景包括:当...

    查看数据库死锁信息

    2. **调整事务隔离级别**:降低事务隔离级别(如从串行化到可重复读)可能有助于减少死锁的发生,但需谨慎操作,因为它可能影响数据一致性。 3. **合理设计业务逻辑**:避免长时间持有锁,尽早释放资源,减少事务中...

    大牛出手MySQL死锁深入分析

    最后,总结中提到,要预防死锁,需要合理设计事务,包括减少事务的大小、避免不必要的长事务、合理安排SQL语句的执行顺序、使用合适的事务隔离级别等。在应用层面,还可以采用乐观锁或悲观锁的策略来避免死锁的发生...

    Ibatis死锁

    - **死锁检测与解除**:数据库系统如MySQL有内置的死锁检测机制,一旦检测到死锁会主动回滚一个事务以解除死锁。 标签 "源码" 和 "工具" 提示我们可能需要深入到Ibatis的源代码中寻找死锁产生的原因,并且可能需要...

    避免或最小化mysql死锁deadlock一些方法.docx

    "MySQL 死锁避免和最小化方法" 在 MySQL 中,死锁是指两个或多个事务之间的资源竞争,导致事务无法继续执行的情况。...同时,需要全面理解事务隔离级别和数据库死锁之间的关系,并掌握各种解决方法。

    一次MYSQL死锁分析案例1

    在MySQL数据库中,死锁是一种常见的并发问题,当两个或多个事务互相等待对方释放资源时,就会发生死锁。本案例中的死锁发生在“pop购药”系统的订单支付状态更新操作中,涉及到了两个事务,我们分别称之为Session1和...

    MySQL事务剖析1

    综上,MySQL事务处理是数据库系统中不可或缺的部分,它通过ACID特性、隔离级别、MVCC和锁机制确保数据的一致性,并在Java、Spring等开发环境中提供了便捷的事务管理接口。理解并合理使用这些概念和机制,对数据库...

    mysql事务共2页.pdf.zip

    MySQL事务是数据库操作的核心概念,尤其对于保证数据的一致性和完整性至关重要。在MySQL中,事务是一组数据库操作,这些操作被视为一个单元,要么全部成功,要么全部回滚,以确保数据库状态的一致性。本资料“mysql...

Global site tag (gtag.js) - Google Analytics