数据库事务

Posted 小楼杂记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库事务相关的知识,希望对你有一定的参考价值。

数据库事务(Transaction)是指数据库管理系统执行过程中一个不可分割的逻辑单元,由有限的数据库操作语句组成。

事务的执行步骤:

begin;SQL execution 1 # rollbackSQL execution 2 # rollback...SQL execution N # rollbackcommit;

begin标识开始一个事务,后面的SQL语句是事务执行的操作,commit(提交)是结束当前事务并提交事务。而在语句执行过程中,可以回滚事务(Rollback),回滚是指将数据恢复成事务开始之前的状态。

为什么需要事务?

数据库有自己的SQL语句,用户可以使用SQL语句操作数据库,那为什么需要事务呢?SQL语句能够直接修改数据库中的数据,但却无法保证数据的一致性。比如经典的转账问题:账户A向账户B转账,只用SQL语句无法保证从账户A扣款成功,同时从账户B增加对应的金额。所以事务是为了保证数据库中数据的一致性。

事务特性

事务特性有哪些特性呢?

  • 原子性(Atomicity):事务作为一个整体被执行,事务中的操作要么全部被执行,要么都不执行。
  • 一致性(Consistency):事务应确保数据库的状态一一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。不能存在事务对数据部分修改的情况。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应该影响其他事务的执行。
  • 持久性(Durability):已经提交的事务对数据库的修改应该永远保存在数据库中。对数据库数据的修改应该持久化到硬盘中,即使服务器当机了,只要数据库能正常访问,就一定能够恢复事务成功结束时的标志。

案例

为说明数据库的特性,举一个经典的事务案例,账户A向账号B转账100元,假设账户A有800元,账户B有300元。要完成这个转账操作需要执行下面事务所包含的所有步骤,才能转账成功。

  1. 读取账户A金额800元。
  2. 对账户A扣取100元,帐户A变为700元(内存)。
  3. 将结果700元写入到A账户中(硬盘)。
  4. 读取账户B金额300元。
  5. 对帐户B进行增加100元,账户B变为400元(内存)。
  6. 将结果400元写入到B账户中(硬盘)。

原子性

原子性保证事务中的所有操作必须全部执行,或全部不执行。上面的转账事务包含6个操作,原子性保证上面的6个操作必须全部执行成功,转账事务才能成功。如果在第2步账号A金额不够100元,转账失败,事务回滚。如果在第6步,突然系统断电或系统崩溃,整个事务还是得回滚。回滚是指将数据恢复到事务执行之前的状态,也就相当于事务中的操作都不执行。

一致性

一致性是指数据库中的数据从一个一致性状态转变到另一个一致性。不能出现部分修改数据的情况。在上面的案例中,转账前账号A与账号B金额总和是1100,转账后还是1100,这就是一致性。不能出现账户A扣钱成功,但账号B没收到钱,那肯定有问题了。

隔离性

在事务执行成功之前,即没有完成commit之前,查询账户A与账号B的金额,还是事务执行之前的数目。其他和A、B相关的并发转账事务或其他事务对当前转账不产生影响。

持久性

当事务commit之后,即事务执行完成的时候,账户A与账户B的金额变成事务执行之后的数目,并持久化到硬盘中,之后的查询可以看到改变后的金额。即使系统故障,该事务也必须永久性生效。