数据库事务

来自计算思维百科
跳转至: 导航搜索
数据库事务.png

数据库事务(transaction)是一系列包装在一起的操作,它要么做完,要么不做。

基本概念

数据库中事务的概念是为了在任何情况下,系统都可以在失败中恢复到正常状态,并且保证信息的一致性;当用户并发访问数据库的时候,事务为用户的访问提供了一个隔离的方法,以防止彼此的操作互相干扰。

应用范围

事务应用于大型数据库管理系统中,企业级的数据库管理系统(DBMS)都有责任提供一种保证事务的物理完整性的机制。就常用的SQL Server2000系统而言,它具备锁定设备隔离事务,记录设备保证事务持久性等机制。

应用1-网上购物

设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:

  1. 更新客户所购商品的库存信息
  2. 保存客户付款信息--可能包括与银行系统的交互
  3. 生成订单并且保存到数据库中
  4. 更新用户相关信息,例如购物数量等等

正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。数据库事务正是用来保证这种情况下交易的平稳性。

应用2-银行账户管理

比如说,不同客户对同一个银行账户的存款和取款。存款需要(1)把账户的金额取出来;(2)加上要存进去的钱;(3)最后把总额存进原来的银行账户。取款和存款大致相同,只不过在第二步的时候,取款时减去取款的金额;假设原来银行账户有500块,客户1要存200块进去,在存款操作只完成了(1)(2)步骤的时候(还没有把总额存进去),客户二要取100块钱,于是取款操作也完成了(1)(2)步骤,然后系统把存款的步骤(3)执行(把700块存进去),最后系统把客户二的取款操作的步骤(3)执行(把400块钱存进这个银行账户。)我们会发现两个操作的正确结果应该是600块,而现在只有400块,问题出现了。

客户1的操作

客户2的操作

银行账户的金额

(1)读取银行账户的金额

 

500

(2)500+200

 

700(但还没有存进去)

 

(1)读取银行账户的金额

500

 

(2)500-100

400

(3)把总额写入银行账户

 

700

 

(3)把总额写入银行账户

400(把700覆盖掉了)

基于上面产生的矛盾,使用事务管理就可以解决上面的问题,客户1先完成存钱事务,然后客户2再完成取钱操作。

可以体现的计算思维

事务体现了计算思维的容错纠错特点,它保证了信息的完整性和一致性,在数据库管理系统中得到了广泛应用。