事务一

事务一

1.事务的基本定义

​ 事务是访问并可能更新各种数据项的一个逻辑单元。

​ 事务的ACID特性:原子性、隔离性、持久性、一致性

二、事务的ACID特性

1.原子性

​ 一个事务是不可分割的,要么执行其全部操作,要么全部不执行,这便是原子性。

​ 通常使用日志系统来保证事务的原子性。事务对数据库所做的每个修改先被记录到日志中。当事务未能成功执行,我们说这个事务中止了。这时,我们便使用日志中的数据来将数据库恢复到事务执行之前的状态,这称为事务的回滚

2.隔离性

​ 当有多个事务并行执行的时候,事务之间不能相互影响,每个事务在自己的视角来看,应该只有它自己在执行,这便是隔离性。实际上就是对并行执行的控制。数据库中完成这项任务的是并发控制部件

隔离性级别

​ 可串行化:保证事务可串行化的执行。串行执行即一个一个的执行,不存在事务的并行。

​ 可重复读:只允许读取已经提交的数据,并且进一步要求一个事务在两次读取一个数据项期间,其他事务不得更新该数据项。

​ 已提交读:只允许读取已经提交的数据。

​ 未提交度:允许读取未提交的数据

​ 注意:以上四种级别均不允许脏写。不允许脏写是如果一个数据项已经被一个未提交或中止的事物写过,那么其他事务禁止再对该数据项进行写操作。

隔离性级别的实现

​ 1.锁:通常我们使用两阶段封锁协议配合共享锁、排他锁来实现。两阶段封锁协议是指事务在第一个阶段只获得锁,第二个阶段只释放锁(实际上通常只有当事务提交或中止时才释放锁)。共享锁用于读,排他锁用于写。许多事务可以同时拥有数据项上的共享锁,但只有当其他任何事务在一个数据项上不持有任何锁的时候,一个事务才运行持有该数据项上的排他锁。

​ 2.时间戳:它为每个事务分配一个时间戳,通常是事务开始的时候。对与每个数据项,系统维护两个时间戳。读时间戳:保留最近读取的该数据项的事务的时间戳。写时间戳:写过该数据项当前值的事务的时间戳。事务依照事务时间戳来访问各个数据项,当不能访问时,违例事务被中止,并分配一个新的时间戳重新开始。

​ 3.多版本和快照隔离:每个事务开始的时候有它自己需要的数据项的快照(即副本)。它从这个私有版本中读取数据,以此来避免冲突。更新同样发生在快照里,当事务被提交的时候,这些更新被真正地写到数据库里。当一个事务进入部分提交状态(即事务最后一个语句被执行后)时,只有在没有其他并发事务修改了该事务想要更新的数据的情况下,才能进入提交状态。不能被提交的事务被中止。

3.一致性

​ 一致性是指系统从一个正-确的状态,迁移到另一个正确的状态。什么叫正确的状态呢?就是当前的状态满足预定的约束就叫做正确的状态.而事务具备ACID里C的特性是说通过事务的AID来保证我们的一致性。

​ 例:转账系统,转账前我的两张卡里钱的总和是1000,我把A中的钱转到B后,总和仍应该是1000。

4.持久性

​ 一旦事务成功执行,它对数据库的改变应该是永久的,即使出现系统故障。

三、事务调度

1.可恢复调度

​ 对于事务A,B如果B读取了由A之前所写过的数据项,那么A的提交操作应该出现在B的提交操作之前。

2.无级联调度

​ 因为单个事务失效而导致一系列事务回滚的现象称为级联回滚

​ 无级联调度是对于每对事物A,B,如果B读取了A中所写的一个数据项,那么A的提交必须出现在B的这一读操作之前。