数据库

事务-基本概念

2019-07-13  本文已影响0人  我是陈炜

1、什么是事务?

事务是指单一逻辑工作单元的集合( 比如  支付宝a转账给b的时候  要保证 a的金额减少和b的金额增加 要么一起成功,要么一起失败)。事务关键性 ---要么执行整个事务,要么属于该事务的操作一个也不执行。事务是访问并且可能更新各种数据项的一个执行单元

2、事务特性有哪些?

原子性(atomicity):一个事务 要么全部执行,要么全部不执行 这种”全”或”无”是原子性

一致性(consistency):  隔离执行事务时(换而言之,没有其他事务并发执行的情况下)保证数据库一致性

隔离性(isolation):需要保证的是 事务 之间不互相影响。如果有3个事务T1,T2,T3 那么对于t1来说 t2,t3的执行结果t1是感知不到的 也互不影响。

持久性(durability): 一旦事务提交,则其所作的修改将会永远保存到数据库中。

3、各自实现逻辑

原子性: 

对于事务要执行写操作的数据项,数据库系统会在磁盘上记录其旧值。这个信息一致记录在一个日志文件上。如果没有完成,那么数据库会从该文件中读取旧值,看起来从未操作过。(这属于数据库恢复系统做的事情)

持久性:

将完成的事务刷盘到磁盘中,但是为了保证强持久性。可以采用下面两种手段 

        1.事务在commit之前 先把数据刷盘

         2.基于操作日志,commit的时候直接基于操作日志 把新值刷盘。系统出现问题的时候 可以重启重新构造更新。(这属于数据库恢复系统做的事情)

          3.把数据刷到稳定性存储器中(stable storage) 基于raid冗余 等技术

隔离性: 

隔离性要求几个事务并发执行的时候,根据隔离级别,互不影响。  实现方式大概有以下几种

                1.基于悲观锁等待,让并发执行的时候 只有一个事务可以执行,其他事务等待。 这回降低数据库的吞吐量,多核cpu的数据库实际串行化的执行命令 降低性能为单线程。。

                2.基于并发控制系统,大概是以下方式配合使用的 1.时间戳 2.多版本控制 3.两阶段提交  4.基于validation(检查) 的协议  5.粒度锁  6.快照隔离。 (数据库并发控制系统)

一致性:

ACID里的AID都是数据库的特征,也就是依赖数据库的具体实现.而唯独这个C,实际上它依赖于应用层,也就是依赖于开发者.这里的一致性是指系统从一个正确的状态,迁移到另一个正确的状态.什么叫正确的状态呢?就是当前的状态满足预定的约束就叫做正确的状态.而事务具备ACID里C的特性是说通过事务的AID来保证我们的一致性.

做个比喻事务就好比一个保镖,我们提到事务就会说ACID,而我们提到保镖会说强壮,保护安全,好功夫,踏实.这里强壮,好功夫和踏实都是保镖自己的特征,而安全是属于你的,而你通过保镖的特征来保护你的安全.

但是这里必须注意,我们能够通过AID保证我们的一致性,但事务本身没办法确保.用上面保镖的例子来说,你正常被保护一定是安全的,但是你故意骗保镖离开你身边,然后你自己溜出去玩.同样,如果你在事务里故意写出违反约束的代码,比如银行系统定时每天给自己的账户打入100w,这个事务是没办法的.

这里我们举个大家都在说的财务系统的例子.

A要向B支付100元,而A的账户中只有90元,并且我们给定账户余额这一列的约束是,不能小于0.那么很明显这条事务执行会失败,因为90-100=-10,小于我们给定的约束了.

这个例子里,支付之前我们数据库里的数据都是符合约束的,但是如果事务执行成功了,我们的数据库数据就破坏约束了,因此事务不能成功,这里我们说事务提供了一致性的保证.然后我们再看个例子

A要向B支付100元,而A的账户中只有90元,我们的账户余额列没有任何约束.但是我们业务上不允许账户余额小于0.因此支付完成后我们会检查A的账户余额,发现余额小于0了,于是我们进行了事务的回滚.

这个例子里,如果事务执行成功,虽然没有破坏数据库的约束,但是破坏了我们应用层的约束.而事务的回滚保证了我们的约束,因此也可以说事务提供了一致性保证(ps:事实上,是我们应用层利用事务回滚保证了我们的约束不被破坏).最后我们再看个例子

A要向B支付100元,而A的账户中只有90元,我们的账户余额列没有任何约束.然后支付成功了.

这里,如果按照很多人的理解,事务不是保证一致性么?直观上账户余额为什么能为负呢.但这里事务执行前和执行后,我们的系统没有任何的约束被破坏.一直都是保持正确的状态.

上一篇下一篇

猜你喜欢

热点阅读