什么是数据库事务?

Jun 5, 2016


事务的定义 

引用一段wikipedia中对数据库事务的定义:

A transaction symbolizes a unit of work performed within a database management system (or similar system) against a database, and treated in a coherent and reliable way independent of other transactions. A transaction generally represents any change in database. Transactions in a database environment have two main purposes:

  1. To provide reliable units of work that allow correct recovery from failures and keep a database consistent even in cases of system failure, when execution stops (completely or partially) and many operations upon a database remain uncompleted, with unclear status.
  2. To provide isolation between programs accessing a database concurrently. If this isolation is not provided, the programs’ outcomes are possibly erroneous.

对应的可以理解为:事务是数据库的基本工作单元,它以all-or-nothing的方式执行,让数据库从一个一致的状态转移到另一个一致的状态。即使系统发生故障,未执行完成的事务依然可以正确恢复,而事务之间可以在不同程度上进行隔离,以保证数据的正确性。

为什么需要事务?

事务是为了保证数据库中数据的完整性和正确性。设想没有正确的事务支持,就可能出现A向B转账,A的钱被扣掉,而B却并没收到钱的情况。事务能保证要么A转账成功,或则失败,而A和B的钱的总额保持一致的状态。事务能够为我们的所有操作保证可确定的结果,在这样的前提下,我们才能进行各种各样的操作。

值得一提的时候,对于简单的网页应用,可能其后台仅有一个数据库,是单点的事务。而在更多的生产系统中,数据源往往不只一个,包含不同类型的数据库,MQ等,这个时候还需要分布式事务(XA事务)的支持才能保证正确性,单点的事务往往由数据库等系统本身保证,而分布式事务还需要上层中间件的支持。

事务的几大特性

事务的几大特性ACID可以说是老生常谈了,这里先列举一下:

  • 原子性:原子性保证一个事务中的所有操作要么全部执行,要么全部不执行(执行中出错则全部回滚)
  • 一致性:事务将使数据库从一个有效的状态转换到另一个有效的状态,满足定义的所有规则,包括约束,级联,触发器等
  • 隔离性:事务之间的执行是相互隔离的
  • 持久性:已提交的事务,将会对数据库产生永久的影响

MySQL对事务的支持

MySQL是互联网企业中用的最多的数据库,大家都知道使用InnoDB或则BerkeleyDB作为存储引擎才支持事务,之后的章节都将默认以MySQL作为范例,采用InnoDB作为存储引擎。


上一篇博客:Spring分布式事务配置(atomikos)
下一篇博客:利用Annotation Processing生成Hibernate工具