事务

来源:互联网 发布:moment.js 计算时间差 编辑:程序博客网 时间:2024/06/05 19:35

        什么是事务:

       事务就是程序中的一系列紧密操作,所有的操作都必须完成,一个事务开始,其中的操作要么全部完成,要么就撤销操作,全都不做。也就是事务的原子性。

       事务的执行有两种结果,一种是所有步骤全部完成,另一种如果其中某个步骤执行失败,那么之前的所有操作回滚,在重新开始所有步骤。

       事务的四个特性(ACDI):

       原子性:原子性就是指事务的所有操作,要么全部做,要么都不做。

       一致性:事务中包含的一系列的操作(增,删,查,改),这些操作必须同时成功 或者 同时失败,列如:

        一个人从账户A中取出100转给B,如果因为某种原因,转账的时候出现差错,即A中钱已经取出来了,而B中并没          有增加钱。这个时候就是不一致的,这时候就需要进行回滚操作,来保持事务的一致性。

       隔离性:一个事务的执行不能干扰另一个事务的执行,事务之间的操作是相互隔离的,一个事务对数据的使用对        其他并发事务是隔离的。对并发事务的执行有着很重要的作用,

       持久性:就是事务成功执行的结果的影响是永久的,即对数据库中数据的改变时永久的,其他的操作都不会让事       务结果返回到事务发生之前。


在事务并发操作时,可能出现的问题有:
     脏读:事务A修改了一个数据,但未提交,事务B读到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。
     不可重复读:在同一个事务中,对于同一份数据读取到的结果不一致。比如,事务B在事务A提交前读到的结果,和提交后读到的结果可能不同。不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。另一种方法是通过MVCC可以在无锁的情况下,避免不可重复读。
     幻读:在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。


DBMS对数据库的保护通过4个方面来实现:

  1. 数据库的恢复
  2. 数据库的并发控制
  3. 数据库的完整性控制
  4. 数据库安全性控制