事务和并发一致性、封锁、隔离级别

2018-05-14  本文已影响0人  九又四分之三o

事务指的是满足 ACID 特性的一系列操作。在数据库中,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。

事务

四大特性

1、原子性(Atomicity)

事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。

2、一致性(Consistency)

数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。

3、隔离性(Isolation)

一个事务所做的修改在最终提交以前,对其它事务是不可见的。。

2、持久性(Durability)

一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。可以通过数据库备份和恢复来保证持久性。

AUTOCOMMIT

MySQL 默认采用自动提交模式。也就是说,如果不显示使用START TRANSACTION语句来开始一个事务,那么每个查询都会被当做一个事务自动提交。

并发一致性问题

在并发环境下,一个事务如果受到另一个事务的影响,那么事务操作就无法满足一致性条件。

问题:

1、丢失修改

2、读脏数据

3、不可重复读

4、幻影读

解决办法:

产生并发不一致性问题主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。
在没有并发的情况下,事务以串行的方式执行,互不干扰,因此可以保证隔离性。在并发的情况下,如果能通过并发控制,让事务的执行结果和某一个串行执行的结果相同,就认为事务的执行结果满足隔离性要求,也就是说是正确的。把这种事务执行方式称为 可串行化调度 。

并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。

封锁

封锁粒度

MySQL 中提供了两种封锁粒度:行级锁以及表级锁。
应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。
但是加锁需要消耗资源,锁的各种操作,包括获取锁,检查锁是否已经解除、释放锁,都会增加系统开销。因此封锁粒度越小,系统开销就越大。

封锁类型

1、读写锁

2、意向锁

封锁协议

1、三级封锁协议

2、两段锁协议

加锁和解锁分为两个阶段进行。事务 T 对数据 A 进行读或者写操作之前,必须先获得对 A 的封锁,并且在释放一个封锁之后,T 不能再获得任何的其它锁。

隔离级别

1. 未提交读(READ UNCOMMITTED)

事务中的修改,即使没有提交,对其它事务也是可见的。

2. 提交读(READ COMMITTED)

一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。

可重复读(REPEATABLE READ)

保证在同一个事务中多次读取同样数据的结果是一样的。

4. 可串行化(SERIALIXABLE)

强制事务串行执行。

四个隔离级别对比

隔离级别 脏读 不可重复读 幻影读
未提交读 YES YES YES
提交读 NO YES YES
可重复读 NO NO YES
可串行化 NO NO NO
上一篇 下一篇

猜你喜欢

热点阅读