mysql用了事务还要用锁吗_mysql事务和锁

本文详细介绍了InnoDB引擎的锁机制,包括事务的ACID属性、并发事务带来的问题和事务的隔离级别。在MySQL中,InnoDB通过行锁、意向锁和间隙锁来实现事务的隔离,防止脏读、不可重复读和幻读。此外,还讨论了MVCC并发控制机制,以及快照读和当前读的概念,展示了如何在可重复读和读已提交隔离级别下实现并发控制。
摘要由CSDN通过智能技术生成

Innodb引擎的锁机制

InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁

事务的ACID

事务是为了实现业务上完整性而实现了,他可以由多条sql语句组成,这些语句要么全部成功,否则发生任何错误都将会回滚。事务具有4个属性。称为事务的ACID属性

原子性(Actomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。

一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。并且在操作数据的过程中,无论使用并行或者是串行的方式执行,得到的最后的结果应该是一致的。

隔离性(Isolation):隔离性是描述多个事务之间操作共同资源时如何处置的问题,选择哪一种隔离方式。数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。

持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

并发事务带来的问题

相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。

更新丢失(Lost Update):当两个事务同时更新一个数据时候,由于同时读取数据表中的数据,并且两个事务都以自己读到的数据为基础进行更新,在写入表时候,后写入的值会覆盖先写入的值,原本应该两次更新的操作丢失了一次。“更新丢失”通常应该是完全避免的,但不能单靠数据库控制器解决,而应该时应用层的责任。

脏读(Dirty Reads):一个事务读取到了另一个事务未提交的数据,该数据可能会发生回滚而失效。

不可重复读(Non-Repeatable Reads):一个事务执行时,前后使用相同的查询语句,第二次读取时发现数据被修改,两次读取到的数据不一致。

幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。

不可重复读和幻读都是两次的查询结果不同,但是不可重复读是倾向于行数据被修改,这个更好解决,对该行加锁即可。而幻读强调的是执行相同的查询时增加或者删除了一整行的数据。处理这个问题锁单行是无法解决的,需要通过锁表实现。这也是两个问题分开提出的原因。

事务的隔离级别

上面的问题在所有关系型数据中都是存在,所以在ISO/ANSI SQL92标准中定义了4个事务隔离级别来分别解决以上的问题。

隔离级别

脏读

不可重复读

幻读

读未提交

存在

存在

存在

读已提交

解决

存在

存在

可重复读

解决

解决

存在

序列化

解决

解决

解决

MySQL的隔离级别的

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值