数据库事务归纳总结

数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。

这句话是百度给出的解释,个人理解是将对数据库操作的语句看做一个整体所有的特性。

提到数据库事务就要说事务的特性了==>ACID,下面是百度对ACID的描述。

并非任意的对数据库的操作序列都是数据库事务。数据库事务拥有以下四个特性,习惯上被称之为ACID特性。

  • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  • 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

先举个例子说原子性一致性,在淘宝购物时,程序猿小明写了个事务,这个事务有两个操作,一个操作是扣除买家10块钱,一个操作是给卖家10块钱,这个事务只允许有两种状态,提交说明操作是正常的,那么买家余额少10块钱,卖家余额多10块钱,回滚说明操作出现了异常(比如卖家余额金额上限了或买家余额不足),买家就不会扣这10块钱,卖家也不会多10块钱,这就是事务应确保数据库的状态从一个一致状态转变为另一个一致状态,订单最终只有两个状态,这就是事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。,那么得出结论。

原子性指的是这个事务最终只有一个状态,提交或回滚。
一致性指的是数据的一致性,卖家多十块买家少十块或买家没有扣钱卖家没有多钱。

隔离性前需要引入几个概念,多个事务并发执行时,一个事务的执行不应影响其他事务的执行。百度的这句话的这个不应,说明了有些情况下多个事务并发情况是可能相互影响的,通过数据库访问数据如果出现并发情况可能会出现三种操作数据不正确的情况。

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

而不同的隔离界别可以解决并发情况出现时出现的问题,来保证业务正确进行。关系型数据库事务隔离级别有四种:
Read Uncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。
Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
Repeated Read:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。
Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。

mysql默认的事务处理级别是REPEATABLE-READ

这些概念和业务场景相互结合,不同的业务场景就不一一举例了。

隔离性指的是正确的事务应该保证数据准确性和操作的正确性。

再举个例子来说持久性,事务提交操作后就无法回滚了,就好比时光一去不复还,过去的就过去了再也回不去了。

持久性指的是提交之后数据将持久化保存无法回滚。

下面来解释下百度的关于ACID的这句话并非任意的对数据库的操作序列都是数据库事务

关系型数据库和菲关系型数据库的使用场景不一样各个的优缺点也不一样,百度说话还是非常严谨的,只说个大概不说那么细致。

举个例子,非关系型数据库redis不支持回滚,redis事务操作中如果执行异常,后续指令会依然执行没有满足原子性一致性,所以说不是所有数据库都支持事务并支持ACID这四个特性,别的数据库使用不多,大多数可以满足原子性,而事务的其他特性很难都满足到,可以自行百度一下。

你可能感兴趣的:(心得体会)