事务简介

一、认识事务

    事务可由一条非常  简单的SQL语句组成,也可以由一组复杂的SQL语句组成。

    事务是访问并更新数据库中各种数据项的一个程序执行单元。

    在事务中的操作,要么都做修改,要么都不做,这就是事务的目的,也是事务模型区别与文件系统的重要特征之一。

    理论上说,事务有着极其严格的定义,他必须满足事务的ACID特征。虽然理论上定义了严格的事务要求,但数据库厂商出于各种目的,并没有严格遵循ACID标准。例如,对于Oracle数据库来说,其默认的事务隔离级别是READ COMMITTED,不满足I的要求,即隔离性要求。对于InnoDB存储引擎,其默认的事务隔离级别是READ REPEATABLE,完全遵循和满足事务的ACID特性

二、ACID

  A(Atomicity)原子性

  在计算机中,每个人都将原子性视为理所当然。例如,调用一个函数,要么返回正确的值,要么返回错误代码,而不会在不可预知的情况下改变任何的数据结构和参数。

  数据库的事务中实现原子性,就不是那么回事了。如用户取款,假设取款流程:

  1)登陆ATM,验证密码

  2)获取账户的信息

  3)输入要提取的金额

  4)更新账户信息

  5)ATM出款

  6)用户取钱

  整个取款的操作过程视为原子性操作,要么都做,要么都不做。而通过事务模型,可以保证该操作的原子性。

  原子性指整个数据库事务是不可分割的工作单位。只有事务中所有操作都成功,才算整个事务成功。事务中任何一个SQL语句执行失败,已经执行成功的SQL语句必须撤回,数据库状态应该退回到执行事务前的状态。

  C(Consistency)一致性

  一致性是指事务将数据库从一种状态转变为下一种一致的状态。

  在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏

  如: 表姓名字段为唯一约束,即表中姓名不能重复。如果一个事务对姓名进行了修改,但在事务提交或回滚后,表中的姓名非唯一了,这就破坏了事务的一致性要求,即事务将数据库从一种状态变成了一种不一致的状态。

  I(Isolation)隔离性

  隔离性还有其他称呼,如并发控制(Concurrency Control),可串行化(Serializability),锁(Locking)等。

  事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离,即该事务提交前对其他事务都不可见,通常使用锁来实现。

  当前数据库中都提供了一种粒度锁(Granular Lock)的策略,允许事务仅锁住一个实体对象的子集,以此来提高事务之间的并发。

  D(Durability)持久性

  事务一旦提交,其结果就是永久性的。即发生宕机等故障,数据库也能将数据恢复。

  需要注意的是,只能从事务本身的角度来保证结果的永久性

  例如,在事务提交后,所有的变化都是永久的。即当数据库因为崩溃而需要恢复时,也能保证恢复后提交的数据不会丢失。但若不是数据库本身发生故障,而是一些外部原因,如RAID卡损坏,自然灾害等原因导致数据库发生问题,那么所有提交数据可能都丢失。

  因此持久性保证事务系统的高可靠性(High Reliability),而不是高可用性(High Availability)。对于高可用性的实现,事务本身并不能保证,需要一些系统共同配合完成。

 

posted @ 2019-06-22 22:01  hyunbar  阅读(221)  评论(0编辑  收藏  举报