精华内容
下载资源
问答
  • 数据库事物
    千次阅读
    2021-02-24 17:15:40

    数据库事务详解

    提示:事务主要是为了保证复杂数据库操作数据的一致性,尤其是在并发访问数据时。MySQL事务主要用于处理操作量大,复杂度高的数据。


    一、什么是数据库事务?

    从根本上理解MySQL事务,是指作为单个逻辑工作单元执行的一系列操作,要么成功完全地执行,要么失败全部回滚。

    最经典的例子:
    用户A往——》用户B账户里转100块钱。
    正常逻辑:首先用户A账户里扣除一百元,然后用户B账户增加100元,则转账操作完成。这是正常情况,接下来再看看这种情况:

    用户A账户里扣除100元,这条操作语句执行完了,正要执行用户B账户增加100元,这时候突然系统出问题了,宕机了程序没有按流程接着往下走。这时候用户A账户里少了100,可用户B账户里却没有增加100。那这怎么办呢? 这时候就该用到事务了。

    上面说过,作为单个逻辑工作单元执行的一系列操作,要么成功完全地执行,要么失败全部回滚。系统要么全部给我走完,要么执行到一半失败了进行回滚:用户A账户里扣了100元,准备往用户B账户里加100元的时候出问题了,好嘛,出问题了就出问题了嘛,我再回滚给用户A账户里加会100元不就好了嘛。

    二、事务有哪些状态?

    事务一共分为五个状态:

    1. 活动的 ( active ) 事务对应的数据库操作再执行过程中,该事务就处于活动的状态。

    2. 部分提交的 ( partially committed ) 当数据库事务中的最后一个操作执行完成,但由于操作都在内存中执行,所以造成的影响并没有更新到磁盘时,该事务就处在部分提交的状态。

    3. 失败的 ( failed ) 当事务处在活动的或者部分提交状态时,可能遇到了某些错误(数据库自身的错误,操作系统错误或者直接断电)而无法继续执行,或者认为的停止当前事务的执行,该事务就处在失败的状态。

    4. 中止的 ( aborted ) 如果事务执行了半截而变成失败的状态,撤销失败事务对当前数据库造成的影响,我们把这个撤销的过程称之为回滚。 当回滚的操作执行完毕,也就是数据库恢复到了执行事务之前的状态,该事务就会处于终止的状态。

    5. 提交的 ( committed ) 当一个处在部分提交的状态事务将修改过的数据都同步到磁盘之后,该事务就处于提交的状态。

    三、事务有哪些特性?

    事务共有四大特性:

    1.原子性( Atomicity)

    事务的数据操作,要么全部执行成功,要么全部失败回滚到执行之前的状态,就像这个事务从来没有执行过一样。事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

    2.一致性( Atomicity)

    一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。一致性处理数据库中对所有语义约束的保护。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。例如,当数据库处于一致性状态S1时,对数据库执行一个事务,在事务执行期间假定数据库的状态是不一致的,当事务执行结束时,数据库处在一致性状态S2。

    3.隔离性 ( Consistency)

    多个事务之前是相互隔离的,互不影响。数据库允许多个并发同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致的数据不一致。
    比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
    隔离性分为四个隔离级别:

    1. 读未提交(Read Uncommitted):
      在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。该隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少,而且还会出现脏读的情况。读取到未提交的数据,也被称之为脏读(Dirty Read)。

    2. 读已提交(Read Committed):
      这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。但会出现以下情况:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

    3. 可重复读(Repeatable Read):
      读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他读事务。避免了不可重复读和脏读,但是会出现幻读,即第二次查询数据时会包含第一次查询中未出现的数据。避免了不可重复读取和脏读,但是有时可能出现幻读。这可以通过“共享读锁”和“排他写锁”实现(MySQL默认的隔离级别)。

    4. 序列化(Serializable):
      当执行某个事务的时候,禁止其他任何事务运行,必须一个一个进行。提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读。

    在这里插入图片描述

    四种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。 MySQL默认隔离级别是可重复读。

    4.持久性(Durability)

    持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
    持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即对已提交事务的更新能恢复。一旦一个事务被提交,DBMS(数据库)必须保证提供适当的冗余,使其耐得住系统的故障。所以,持久性主要在于DBMS的恢复性能。

    四、事务是如何实现的

    事物是通过事物日志来实现的,事物日志包括:redo log和undo log;

    redo log 是重做日志:
    重做日志是每当有操作执行前,将数据真正更改时,先前相关操作写入重做日志。这样当断电,或者一些意外,导致后续任务无法完成时,系统恢复后,可以继续完成这些更改。

    undo log 是回滚日志
    回滚日志是当一些事务在执行一半时,发生意外,导致后续操作无法完成,则可以根据回滚日志恢复到执行该事务之前的壮态。


    另外推荐一篇sql语法调优文章,希望对各位小伙伴能有所提升!

    SQL语法优化宝典传送门

    更多相关内容
  • 数据库事务的概念及其实现原理

    千次阅读 2021-07-02 10:59:05
    1.1 为什么需要数据库事务 1.2 什么是数据库事务 1.3 事务如何解决问题 1.4 事务的ACID特性以及实现原理概述 2.并发异常与并发控制技术 2.1 常见的并发异常 2.2 事务的隔离级别 2.3 事务隔离性的实现...

    目录


    事务是数据库系统中的重要概念,了解这一概念是以正确的方式开发和数据库交互的应用程序的前提。但是很多开发者对于事务的认识相对片面和肤浅,仅仅把它等同于ACID,不了解数据库系统引入事务的真正动机,ACID对于事务意味着什么以及最重要的:数据库系统是如何保证事务的ACID特性的?
    因为最近在导师手下做一个微服务和分布式事务相关的课题项目,作为必要的前置准备,需要加深下对单机事务的认识并理解其实现原理。这篇文章是在我给组内的小伙伴分享的PPT的基础上改动而成,旨在帮助大家建立关于事务的相对体系的认识。由于当时正好赶上考试周,所以写的比较仓促,里面肯定有理解不到位甚至出错的地方,希望看到的小伙伴能够我指出来。同时还需强调几点:

    • 以下所有内容都是针对单机事务而言,不涉及分布式事务相关的东西!
    • 关于事务原理的讲解不针对具体的某个数据库实现,所以某些地方可能和你的实践经验不符。

    1. 认识事务

    1.1 为什么需要数据库事务

    转账是生活中常见的操作,比如从A账户转账100元到B账号。站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成:

    • 1.将A账户的金额减少100元
    • 2.将B账户的金额增加100元。

    在这个过程中可能会出现以下问题:

    • 1.转账操作的第一步执行成功,A账户上的钱减少了100元,但是第二步执行失败或者未执行便发生系统崩溃,导致B账户并没有相应增加100元。
    • 2.转账操作刚完成就发生系统崩溃,系统重启恢复时丢失了崩溃前的转账记录。
    • 3.同时又另一个用户转账给B账户,由于同时对B账户进行操作,导致B账户金额出现异常。

    为了便于解决这些问题,需要引入数据库事务的概念。

    1.2 什么是数据库事务

    定义:数据库事务是构成单一逻辑工作单元的操作集合
    一个典型的数据库事务如下所示

    BEGIN TRANSACTION  //事务开始
    SQL1
    SQL2
    COMMIT/ROLLBACK   //事务提交或回滚
    

    关于事务的定义有几点需要解释下:

    • 1.数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。
    • 2.构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
    • 3.构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
    • 4.以上即使在数据库出现故障以及并发事务存在的情况下依然成立。

    1.3 事务如何解决问题

    对于上面的转账例子,可以将转账相关的所有操作包含在一个事务中

    BEGIN TRANSACTION 
    A账户减少100元
    B账户增加100元
    COMMIT
    
    • 1.当数据库操作失败或者系统出现崩溃,系统能够以事务为边界进行恢复,不会出现A账户金额减少而B账户未增加的情况。
    • 2.当有多个用户同时操作数据库时,数据库能够以事务为单位进行并发控制,使多个用户对B账户的转账操作相互隔离。

    事务使系统能够更方便的进行故障恢复以及并发控制,从而保证数据库状态的一致性。

    1.4 事务的ACID特性以及实现原理概述

    原子性(Atomicity):事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。

    一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。一致性状态是指:1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等) 2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。

    隔离性(Isolation):并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。

    持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。

    在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面

    • 1.事务的并发执行
    • 2.事务故障或系统故障

    数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。

    并发控制技术保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏。
    日志恢复技术保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。

    2.并发异常与并发控制技术

    2.1 常见的并发异常

    在讲解并发控制技术前,先简单介绍下数据库常见的并发异常。

    • 脏写
      脏写是指事务回滚了其他事务对数据项的已提交修改,比如下面这种情况

    在事务1对数据A的回滚,导致事务2对A的已提交修改也被回滚了。

    • 丢失更新
      丢失更新是指事务覆盖了其他事务对数据的已提交修改,导致这些修改好像丢失了一样。

    事务1和事务2读取A的值都为10,事务2先将A加上10并提交修改,之后事务2将A减少10并提交修改,A的值最后为,导致事务2对A的修改好像丢失了一样

    • 脏读
      脏读是指一个事务读取了另一个事务未提交的数据

    在事务1对A的处理过程中,事务2读取了A的值,但之后事务1回滚,导致事务2读取的A是未提交的脏数据。

    • 不可重复读
      不可重复读是指一个事务对同一数据的读取结果前后不一致。脏读和不可重复读的区别在于:前者读取的是事务未提交的脏数据,后者读取的是事务已经提交的数据,只不过因为数据被其他事务修改过导致前后两次读取的结果不一样,比如下面这种情况

    由于事务2对A的已提交修改,事务1前后两次读取的结果不一致。

    • 幻读
      幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中,比如下面这种情况:

    事务1查询A<5的数据,由于事务2插入了一条A=4的数据,导致事务1两次查询得到的结果不一样

    2.2 事务的隔离级别

    1. 事务具有隔离性,理论上来说事务之间的执行不应该相互产生影响,其对数据库的影响应该和它们串行执行时一样。

    2. 然而完全的隔离性会导致系统并发性能很低,降低对资源的利用率,因而实际上对隔离性的要求会有所放宽,这也会一定程度造成对数据库一致性要求降低

    3. SQL标准为事务定义了不同的隔离级别,从低到高依次是

    • 读未提交(READ UNCOMMITTED)
    • 读已提交(READ COMMITTED)
    • 可重复读(REPEATABLE READ)
    • 串行化(SERIALIZABLE)

    事务的隔离级别越低,可能出现的并发异常越多,但是通常而言系统能提供的并发能力越强。

    不同的隔离级别与可能的并发异常的对应情况如下表所示,有一点需要强调,这种对应关系只是理论上的,对于特定的数据库实现不一定准确,比如mysql
    的Innodb存储引擎通过Next-Key Locking技术在可重复读级别就消除了幻读的可能。

    所有事务隔离级别都不允许出现脏写,而串行化可以避免所有可能出现的并发异常,但是会极大的降低系统的并发处理能力。

    2.3 事务隔离性的实现——常见的并发控制技术

    并发控制技术是实现事务隔离性以及不同隔离级别的关键,实现方式有很多,按照其对可能冲突的操作采取的不同策略可以分为乐观并发控制和悲观并发控制两大类。

    • 乐观并发控制:对于并发执行可能冲突的操作,假定其不会真的冲突,允许并发执行,直到真正发生冲突时才去解决冲突,比如让事务回滚。

    • 悲观并发控制:对于并发执行可能冲突的操作,假定其必定发生冲突,通过让事务等待(锁)或者中止(时间戳排序)的方式使并行的操作串行执行。

    2.3.1 基于封锁的并发控制

    核心思想:对于并发可能冲突的操作,比如读-写,写-读,写-写,通过锁使它们互斥执行。
    锁通常分为共享锁和排他锁两种类型

    • 1.共享锁(S):事务T对数据A加共享锁,其他事务只能对A加共享锁但不能加排他锁。
    • 2.排他锁(X):事务T对数据A加排他锁,其他事务对A既不能加共享锁也不能加排他锁

    基于锁的并发控制流程:

    1. 事务根据自己对数据项进行的操作类型申请相应的锁(读申请共享锁,写申请排他锁)

    2. 申请锁的请求被发送给锁管理器。锁管理器根据当前数据项是否已经有锁以及申请的和持有的锁是否冲突决定是否为该请求授予锁。

    3. 若锁被授予,则申请锁的事务可以继续执行;若被拒绝,则申请锁的事务将进行等待,直到锁被其他事务释放。

    可能出现的问题:

    • 死锁:多个事务持有锁并互相循环等待其他事务的锁导致所有事务都无法继续执行。

    • 饥饿:数据项A一直被加共享锁,导致事务一直无法获取A的排他锁。

    对于可能发生冲突的并发操作,锁使它们由并行变为串行执行,是一种悲观的并发控制。

    2.3.2 基于时间戳的并发控制

    核心思想:对于并发可能冲突的操作,基于时间戳排序规则选定某事务继续执行,其他事务回滚。

    系统会在每个事务开始时赋予其一个时间戳,这个时间戳可以是系统时钟也可以是一个不断累加的计数器值,当事务回滚时会为其赋予一个新的时间戳,先开始的事务时间戳小于后开始事务的时间戳。

    每一个数据项Q有两个时间戳相关的字段:
    W-timestamp(Q):成功执行write(Q)的所有事务的最大时间戳
    R-timestamp(Q):成功执行read(Q)的所有事务的最大时间戳

    时间戳排序规则如下:

    1. 假设事务T发出read(Q),T的时间戳为TS
      a.若TS(T)<W-timestamp(Q),则T需要读入的Q已被覆盖。此
      read操作将被拒绝,T回滚。
      b.若TS(T)>=W-timestamp(Q),则执行read操作,同时把
      R-timestamp(Q)设置为TS(T)与R-timestamp(Q)中的最大值

    2. 假设事务T发出write(Q)
      a.若TS(T)<R-timestamp(Q),write操作被拒绝,T回滚。
      b.若TS(T)<W-timestamp(Q),则write操作被拒绝,T回滚。
      c.其他情况:系统执行write操作,将W-timestamp(Q)设置
      为TS(T)。

    基于时间戳排序和基于锁实现的本质一样:对于可能冲突的并发操作,以串行的方式取代并发执行,因而它也是一种悲观并发控制。它们的区别主要有两点:

    • 基于锁是让冲突的事务进行等待,而基于时间戳排序是让冲突的事务回滚。
    • 基于锁冲突事务的执行次序是根据它们申请锁的顺序,先申请的先执行;而基于时间戳排序是根据特定的时间戳排序规则。

    2.3.3 基于有效性检查的并发控制

    核心思想:事务对数据的更新首先在自己的工作空间进行,等到要写回数据库时才进行有效性检查,对不符合要求的事务进行回滚。

    基于有效性检查的事务执行过程会被分为三个阶段:

    1. 读阶段:数据项被读入并保存在事务的局部变量中。所有write操作都是对局部变量进行,并不对数据库进行真正的更新。

    2. 有效性检查阶段:对事务进行有效性检查,判断是否可以执行write操作而不违反可串行性。如果失败,则回滚该事务。

    3. 写阶段:事务已通过有效性检查,则将临时变量中的结果更新到数据库中。

    有效性检查通常也是通过对事务的时间戳进行比较完成的,不过和基于时间戳排序的规则不一样。

    该方法允许可能冲突的操作并发执行,因为每个事务操作的都是自己工作空间的局部变量,直到有效性检查阶段发现了冲突才回滚。因而这是一种乐观的并发策略。

    2.3.4 基于快照隔离的并发控制

    快照隔离是多版本并发控制(mvcc)的一种实现方式。

    其核心思想是:数据库为每个数据项维护多个版本(快照),每个事务只对属于自己的私有快照进行更新,在事务真正提交前进行有效性检查,使得事务正常提交更新或者失败回滚。

    由于快照隔离导致事务看不到其他事务对数据项的更新,为了避免出现丢失更新问题,可以采用以下两种方案避免:

    • 先提交者获胜:对于执行该检查的事务T,判断是否有其他事务已经将更新写入数据库,是则T回滚否则T正常提交。

    • 先更新者获胜:通过锁机制保证第一个获得锁的事务提交其更新,之后试图更新的事务中止。

    事务间可能冲突的操作通过数据项的不同版本的快照相互隔离,到真正要写入数据库时才进行冲突检测。因而这也是一种乐观并发控制。

    2.3.5 关于并发控制技术的总结

    以上只是对常见的几种并发控制技术进行了介绍,不涉及特别复杂的原理的讲解。之所以这么做一是要真的把原理和实现细节讲清楚需要涉及的东西太多,篇幅太长,从作者和读者角度而言都不是一件轻松的事,所以只对其实现的核心思想和实现要点进行了简单的介绍,其他部分就一笔带过了。二是并发控制的实现的方式太过多样,基于封锁的实现就有很多变体,mvcc多版本并发控制的实现方式就更是多样,而且很多时候会和其他并发控制方式比如封锁的方式结合起来使用。

    3. 故障与故障恢复技术

    3.1 为什么需要故障恢复技术

    数据库运行过程中可能会出现故障,这些故障包括事务故障和系统故障两大类

    • 事务故障:比如非法输入,系统出现死锁,导致事务无法继续执行。
    • 系统故障:比如由于软件漏洞或硬件错误导致系统崩溃或中止。

    这些故障可能会对事务和数据库状态造成破坏,因而必须提供一种技术来对各种故障进行恢复,保证数据库一致性,事务的原子性以及持久性。数据库通常以日志的方式记录数据库的操作从而在故障时进行恢复,因而可以称之为日志恢复技术。

    3.2 事务的执行过程以及可能产生的问题

    事务的执行过程可以简化如下:

    1. 系统会为每个事务开辟一个私有工作区

    2. 事务读操作将从磁盘中拷贝数据项到工作区中,在执行写操作前所有的更新都作用于工作区中的拷贝.

    3. 事务的写操作将把数据输出到内存的缓冲区中,等到合适的时间再由缓冲区管理器将数据写入到磁盘。

    由于数据库存在立即修改和延迟修改,所以在事务执行过程中可能存在以下情况:

    • 在事务提交前出现故障,但是事务对数据库的部分修改已经写入磁盘数据库中。这导致了事务的原子性被破坏。
    • 在系统崩溃前事务已经提交,但数据还在内存缓冲区中,没有写入磁盘。系统恢复时将丢失此次已提交的修改。这是对事务持久性的破坏。

    3.3 日志的种类和格式

    • <T,X,V1,V2>:描述一次数据库写操作,T是执行写操作的事务的唯一标识,X是要写的数据项,V1是数据项的旧值,V2是数据项的新值。

    • <T,X,V1>:对数据库写操作的撤销操作,将事务T的X数据项恢复为旧值V1。在事务恢复阶段插入。

    • <T start>: 事务T开始

    • <T commit>: 事务T提交

    • <T abort>: 事务T中止

    关于日志,有以下两条规则

    • 1.系统在对数据库进行修改前会在日志文件末尾追加相应的日志记录。
    • 2.当一个事务的commit日志记录写入到磁盘成功后,称这个事务已提交,但事务所做的修改可能并未写入磁盘

    3.4 日志恢复的核心思想

    • 撤销事务undo:将事务更新的所有数据项恢复为日志中的旧值,事务撤销完毕时将插入一条<T abort>记录。

    • 重做事务redo:将事务更新的所有数据项恢复为日志中的新值。

    事务正常回滚/因事务故障中止将进行redo
    系统从崩溃中恢复时将先进行redo再进行undo。

    以下事务将进行undo:日志中只包括<T start>记录,但既不包括<T commit>记录也不包括<T abort>记录.

    以下事务将进行redo:日志中包括<T start>记录,也包括<T commit>记录或<T abort>记录。

    假设系统从崩溃中恢复时日志记录如下

    <T0 start>
    <T0,A,1000,950>
    <T0,B,2000,2050>
    <T0 commit>
    <T1 start>
    <T1,C,700,600>
    
    

    由于T0既有start记录又有commit记录,将会对事务T0进行重做,执行相应的redo操作。
    由于T1只有start记录,将会对T1进行撤销,执行相应的undo操作,撤销完毕将写入一条abort记录。

    3.5 事务故障中止/正常回滚的恢复流程

    1. 从后往前扫描日志,对于事务T的每个形如<T,X,V1,V2>的记录,将旧值V1写入数据项X中。

    2. 往日志中写一个特殊的只读记录<T,X,V1>,表示将数据项恢复成旧值V1,
      这是一个只读的补偿记录,不需要根据它进行undo。

    3. 一旦发现了<T start>日志记录,就停止继续扫描,并往日志中写一个
      <T abort>日志记录。

    3.6 系统崩溃时的恢复过程(带检查点)

    检查点是形如<checkpoint L>的特殊的日志记录,L是写入检查点记录时还未提交的事务的集合,系统保证在检查点之前已经提交的事务对数据库的修改已经写入磁盘,不需要进行redo。检查点可以加快恢复的过程。

    系统奔溃时的恢复过程分为两个阶段:重做阶段和撤销阶段。

    重做阶段:

    1. 系统从最后一个检查点开始正向的扫描日志,将要重做的事务的列表undo-list设置为检查点日志记录中的L列表。

    2. 发现<T,X,V1,V2>的更新记录或<T,X,V>的补偿撤销记录,就重做该操作。

    3. 发现<T start>记录,就把T加入到undo-list中。

    4. 发现<T abort><T commit>记录,就把T从undo-list中去除。

    撤销阶段:

    1. 系统从尾部开始反向扫描日志

    2. 发现属于undo-list中的事务的日志记录,就执行undo操作

    3. 发现undo-list中事务的T的<T start>记录,就写入一条<T abort>记录,
      并把T从undo-list中去除。

    4.undo-list为空,则撤销阶段结束

    总结:先将日志记录中所有事务的更新按顺序重做一遍,在针对需要撤销的事务按相反的顺序执行其更新操作的撤销操作。

    3.6.1 一个系统崩溃恢复的例子

    恢复前的日志如下,写入最后一条日志记录后系统崩溃

    <T0 start>
    <T0,B,2000,2050>
    <T2 commit>
    <T1 start>
    <checkpoint {T0,T1}>   //之前T2已经commit,故不用重做
    <T1,C,700,600>
    <T1 commit>
    <T2 start>
    <T2,A,500,400>
    <T0,B,2000>
    <T0 abort>   //T0回滚完成,插入该记录后系统崩溃
    
    
    

    4. 总结

    事务是数据库系统进行并发控制的基本单位,是数据库系统进行故障恢复的基本单位,从而也是保持数据库状态一致性的基本单位。ACID是事务的基本特性,数据库系统是通过并发控制技术和日志恢复技术来对事务的ACID进行保证的,从而可以得到如下的关于数据库事务的概念体系结构。

    5. 参考资料

    《数据库系统概论》
    《数据库系统概念》

    展开全文
  • 数据库事务一致性的理解

    千次阅读 2022-01-25 12:00:48
    一致性是数据库系统的一项要求:任何数据库事务修改数据必须满足定义好的规则,包括数据完整性(约束)、级联回滚、触发器等。 我对一致性的理解 “一致”是指数据库中的数据是正确的,不存在矛盾。事务的一致性是...

    一致性的定义

    • 百度百科-一致性:

    一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。

    • 百度百科-事务一致性:

    一个或多个事务执行后,原来一致的数据和数据库仍然是一致的。它主要涉及事务的原子性。

    • 维基百科-一致性(数据库)

    一致性是数据库系统的一项要求:任何数据库事务修改数据必须满足定义好的规则,包括数据完整性(约束)、级联回滚、触发器等。

    我对一致性的理解

    “一致”是指数据库中的数据是正确的,不存在矛盾。事务的一致性是指事务执行前后,数据都是正确的,不存在矛盾。如果执行后数据是矛盾的,事务就会回滚到执行前的状态(执行前是一致的)。


    满足一致性的例子

    • 学生表中的学号是唯一的。
    • 账户的余额减少了,账单中要有对应的扣款记录,且减少的金额和账单的扣款金额一致。
    • 一篇文章浏览量为100次,则浏览记录表有该文章的100条浏览记录。
    • 发布文章的用户ID是100,则用户表中存在ID为100的用户。

    不满足一致性的例子

    • 学生表中有重复的学号。
    • 转账成功了,但是付款的人余额没扣,或者收款的人余额没有增加。
    • 付款多次,只扣款1次(或者付款1次,扣款多次)。
    • 发布文章的用户ID是100,但用户表中没有ID=100的用户。
    • 文章的发布时间是空的。
    • 用户的年龄是负数。
    • 用户的年龄是几个字母。

    数据库如何实现一致性?

    • 唯一索引

    给学号添加唯一索引,创建学生信息时,如果已存在相同学号,则创建失败。

    • 外键约束

    给文章表的用户ID创建外键,创建文章时,如果不存在对应的用户,则创建失败;删除用户时,如果文章表有该用户的文章,则无法删除用户,或者将用户与文章一起删除。

    • 触发器

    插入文章的浏览记录时,使用触发器去更新对应文章的浏览量(保证每增加一条浏览记录,对应文章浏览量+1)。

    • 指定数据类型

    设置年龄的类型为非负整数,则年龄为负数、字母时保存失败。

    • 设置默认值

    如果没有指定文章的发布时间,则默认以文章记录的插入时间作为发布时间。

    • 设置字段不能为空

    设置文章的发布时间NOT NULL,没指定发布时间,或发布时间为NULL时,文章创建失败。

    • 事务的原子性
      事务的原子性是指同一个事务中的操作,要么都成功,要么都失败。以A向B转账100元转账为例,需要执行以下2个操作:

    1.将A的余额减少100元;
    2.将B的余额增加100元。

    这两个操作要么都成功,要么都失败,否则最后账目就会对不上(破坏一致性)。事务的原子性可以保证以上两个操作同时成功,或者同时失败。

    • 事务的隔离性

    在并发的情况下,只靠事务的原子性并不能保证一致性。举个例子,A有100元,A同时向B发起两笔转账请求,转账金额分别是99元和1元。
    在这里插入图片描述
    两笔转账都执行成功了,理论上A的余额为0,但实际上A的余额被请求2修改为99元,数据的一致性被破坏了!

    再举一个例子,A同时发起两笔转账,其中一笔因为某些原因操作失败,事务回滚,而另外一笔转账执行成功。执行时间线如下:

    在这里插入图片描述
    在这个场景下,A实际转账成功了1元,但是A的余额最终为0,数据的一致性又被破坏了!

    事务的隔离性可以在多个事务并发执行的情况下,通过加锁等方式,保证数据的一致性。

    什么是事务?

    事务就是「一组原子性的SQL查询」,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败

    事务控制语法知道吗?

    BEGIN 或 START TRANSACTION 显式地开启一个事务;
    COMMIT / COMMIT WORK二者是等价的。提交事务,并使已对数据库进行的所有修改成为永久性的;
    ROLLBACK / ROLLBACK WORK。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
    SAVEPOINT identifier 在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
    RELEASE SAVEPOINT identifier 删除一个事务的保存点;
    ROLLBACK TO identifier 把事务回滚到标记点;
    SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE
    
    START TRANSACTION;
    SELECT balance FROM CMBC WHERE username='lemon';
    UPDATE CMBC SET balance = balance - 1000000.00 WHERE username = 'lemon';
    UPDATE ICBC SET balance = balance + 1000000.00 WHERE username = 'lemon';
    COMMIT;
    
    • 原子性(atomicity)

    一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作。

    • 一致性(consistency)

    数据库总是从一个一致性的状态转换到另外一个一致性的状态。在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,CMBC账户中也不会损失100万,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。

    • 隔离性(isolation)

    通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时如果有其他人也准备给lemon的CMBC账户存钱,那他看到的CMBC账户里还是有100万的。

    • 持久性(durability)

    一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。持久性是个有点模糊的概念,因为实际上持久性也分很多不同的级别。有些持久性策略能够提供非常强的安全保障,而有些则未必。而且「不可能有能做到100%的持久性保证的策略」否则还需要备份做什么。

    什么是脏读、不可重复读、幻读?

    脏读

    在事务A修改数据之后提交数据之前,这时另一个事务B来读取数据,如果不加控制,事务B读取到A修改过数据,之后A又对数据做了修改再提交,则B读到的数据是脏数据,此过程称为脏读Dirty Read。

    在这里插入图片描述
    不可重复读

    一个事务内在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了变更、或者某些记录已经被删除了。
    在这里插入图片描述
    幻读
    事务A在按查询条件读取某个范围的记录时,事务B又在该范围内插入了新的满足条件的记录,当事务A再次按条件查询记录时,会产生新的满足条件的记录(幻行 Phantom Row)
    在这里插入图片描述

    不可重复读与幻读有什么区别?

    • 不可重复读的重点是修改:
      在同一事务中,同样的条件,第一次读的数据和第二次读的「数据不一样」。(因为中间有其他事务提交了修改)
    • 幻读的重点在于新增或者删除:
      在同一事务中,同样的条件,第一次和第二次读出来的「记录数不一样」。(因为中间有其他事务提交了插入/删除

    SQL的四个隔离级别知道吗?具体是什么解决了什么问题说说看

    SQL实现了四个标准的隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
    在这里插入图片描述
    各个隔离级别可以不同程度的解决脏读、不可重复读、幻读。隔离级别各有所长,没有完美的解决方案,脱离业务场景谈具体实施都是耍流氓。
    在这里插入图片描述
    MySQL中哪些存储引擎支持事务?

    MySQL中InnoDB和NDB Cluster存储引擎提供了事务处理能力,以及其他支持事务的第三引擎

    什么是自动提交?

    MySQL默认采用自动提交AUTOCOMMIT模式。也就是说,如果不是显式地开始一个事务,则每个查询都被当作一个事务执行提交操作。

    对于MyISAM或者内存表这些事务型的表,修改AUTOCOMMIT不会有任何影响。对这类表来说,没有COMMIT或者ROLLBACK的概念,也可以说是相当于一直处于AUTOCOMMIT启用的模式。

    在事务中可以混合使用存储引擎吗?

    尽量不要再同一个事务中使用多种存储引擎,MySQL服务器层不管理事务,事务是由下层的存储引擎实现的。

    如果在事务中混合使用了事务型和非事务型的表(例如InnoDB和MyISAM表),在正常提交的情况下不会有什么问题。

    但如果该事务需要回滚,非事务型的表上的变更就无法撤销,这会导致数据库处于不一致的状态,这种情况很难修复,事务的最终结果将无法确定。所以,为每张表选择合适的存储引擎非常重要。

    MySQL存储引擎类型有哪些?

    最常用的存储引擎是InnoDB引擎和MyISAM存储引擎,InnoDB是MySQL的默认事务引擎。

    InnoDB存储引擎的特点和应用场景?

    InnoDB是MySQL的默认「事务引擎」,被设置用来处理大量短期(short-lived)事务,短期事务大部分情况是正常提交的,很少会回滚。

    特点

    采用多版本并发控制(MVCC,MultiVersion Concurrency
    Control)来支持高并发。并且实现了四个标准的隔离级别,通过间隙锁next-key locking策略防止幻读的出现。

    引擎的表基于聚簇索引建立,聚簇索引对主键查询有很高的性能。不过它的二级索引secondary
    index非主键索引中必须包含主键列,所以如果主键列很大的话,其他的所有索引都会很大。因此,若表上的索引较多的话,主键应当尽可能的小。另外InnoDB的存储格式是平台独立。

    InnoDB做了很多优化,比如:磁盘读取数据方式采用的可预测性预读、自动在内存中创建hash索引以加速读操作的自适应哈希索引(adaptive
    hash index),以及能够加速插入操作的插入缓冲区(insert buffer)等。

    InnoDB通过一些机制和工具支持真正的热备份,MySQL的其他存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。

    MyISAM存储引擎的特点和应用场景?

    MyISAM是MySQL 5.1及之前的版本的默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不「支持事务和行级锁」,对于只读数据,或者表比较小、可以容忍修复操作,依然可以使用它。

    InnoDB与MyISAM对比
    在这里插入图片描述
    感谢
    https://blog.51cto.com/u_14163302/2551117
    https://www.zhihu.com/question/31346392/answer/1707203839

    展开全文
  • 数据库事务的简单介绍

    千次阅读 2022-04-12 22:07:09
    事务是逻辑上的一组数据库操作,要么都执行,要么都不执行。 例子:假如张三要给李四转账200元,这个转账会涉及到两个关键操作就是:将张三的余额减少200元,将李四的余额增加200元。如果两个操作之间突然出现错误...

    事务和锁

    一、什么是事务

    事务是逻辑上的一组数据库操作,要么都执行,要么都不执行

    例子:假如张三要给李四转账200元,这个转账会涉及到两个关键操作就是:将张三的余额减少200元,将李四的余额增加200元。如果两个操作之间突然出现错误,例如银行系统崩溃导致张三余额减少,而李四的余额没有增加,这样的系统是有问题的。事务就是保证这两个关键操作要么都成功,要么都要失败。

    事务的特性

    原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;例如转账的这两个关键操作(将张三的余额减少200元,将李四的余额增加200元)要么全部完成,要么全部失败。

    一致性: 确保从一个正确的状态转换到另外一个正确的状态,这就是一致性。例如转账业务中,将张三的余额减少200元,中间发生断电情况,李四的余额没有增加200元,这个就是不正确的状态,违反一致性。又比如表更新事务,一部分数据更新了,但一部分数据没有更新,这也是违反一致性的;

    隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

    持久性:一个事务被提交之后,对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

    二、事务之间的相互影响

    事务之间的相互影响分为几种,分别为:脏读,不可重复读,幻读,丢失更新

    脏读

    事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的账户,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。

    当事务 T1 正在访问字段 A 并且对进行了修改,而这种修改还没有提交到数据库中。这时另外一个事务 T2 也访问和使用字段 A,但由于事务 T1 修改字段 A 后还没有提交 COMMIT,而那么事务 T2 读到的字段 A 是**“脏数据”**。

    在这里插入图片描述

    丢失更新

    第一类丢失更新: 撤销一个事务的时候,把其它事务已提交的更新数据覆盖了。这是完全没有事务隔离级别造成的。如果事务1被提交,另一个事务被撤销,那么会连同事务1所做的更新也被撤销。

    在这里插入图片描述

    第二类丢失更新:当两个或多个事务查询相同的记录,然后各自基于查询的结果更新记录时会造成第二类丢失更新问题。每个事务不知道其它事务的存在,最后一个事务对记录所做的更改将覆盖其它事务之前对该记录所做的更改。

    例如:事务 T1 读取 A=20,事务 T2 也读取 A=20,事务 T1 修改 A=A-1,事务 T2 也修改 A=A+1,最终结果 A=21,事务 T1 的修改被丢失。

    在这里插入图片描述

    不可重复读

    事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待妻子转出金额事务提交完)。程序员就会很郁闷,明明卡里是有钱的…

    不可重复读取是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的。

    不可重复读出现的原因就是事务并发修改记录,要避免这种情况,最简单的方法就是对要修改的记录加锁,这回导致锁竞争加剧,影响性能。

    在这里插入图片描述

    幻读

    事例:程序员某一天去消费,花了2千元,然后他的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了2千元,就在这个时候,程序员花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当妻子打印程序员的消费记录清单时(妻子事务提交),发现花了1.2万元,似乎出现了幻觉。

    在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录, 就好像发生了幻觉一样。

    幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。

    在这里插入图片描述

    三、数据库隔离级别及原理

    在这里插入图片描述

    锁类型简述

    共享锁(S锁):假设事务T1对数据A加上共享锁,那么事务T2可以读数据A,不能修改数据A。
    排他锁(X锁):假设事务T1对数据A加上共享锁,那么事务T2不能读数据A,不能修改数据A。

    读未提交

    Read Uncommitted:最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。

    原理:

    • 事务对当前读取的数据不加锁;
    • 事务对数据更新前添加 行级共享锁,直到事务结束才释放。

    可能发生的情况:

    • 事务1读取某些数据记录时,事务2也能对这些记录进行读取、更新;当事务2对这些记录进行更新时,事务1再次读取记录,能读到事务2对该记录的修改版本,即使更新尚未提交。
    • 事务1更新某些数据记录时,事务2不能对这行记录做更新,直到事务1结束。

    简单地理解就是:

    • 允许事务同时读数据
    • 允许一个事务读取数据同时另外一个事务修改数据
    • 必须等更新数据的事务执行完成后,才能对执行其他的读取或者修改该数据的事务

    读已提交

    Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。

    原理:

    • 事务对当前被读取的数据加 行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;
    • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。

    可能发生的情况:

    • 事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的只能是事务2对其更新前的版本,要不就是事务2提交后的版本。
    • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。

    简单地理解就是:

    • 允许事务同时读数据
    • 必须一个事务读取完数据后,另外一个事务才能修改该数据
    • 必须等更新数据的事务执行完成后,才能对执行其他的读取或者修改该数据的事务

    可重复读

    Repeated Read:在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。

    原理:

    • 事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加 行级共享锁,直到事务结束才释放;
    • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。

    可能发生的情况:

    • 事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的仍然是第一次读取的那个版本。
    • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。

    简单地理解就是:

    • 允许事务同时读数据
    • 必须等读取数据的事务执行完成后,才能对执行其他的修改该数据的事务
    • 必须等更新数据的事务执行完成后,才能对执行其他的读取或者修改该数据的事务

    可序列化

    Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。

    • 事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加 行级共享锁,直到事务结束才释放;
    • 事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。

    可能发生的情况:

    • 事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的仍然是第一次读取的那个版本。
    • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。

    简单地理解就是:

    • 所有的事务必须等上一个事务执行完成后才开始执行

    参考:

    数据库的4种隔离级别

    数据库隔离级别 及 其实现原理

    【原创】惊!史上最全的select加锁分析(Mysql)

    数据库隔离级别及原理解决方案

    【原创】惊!史上最全的select加锁分析(Mysql)

    数据库隔离级别及原理解决方案

    展开全文
  • 什么是数据库事务

    千次阅读 2022-04-01 17:17:55
    数据库事务(简称事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 数据库事务拥有以下四个特性,被称为ACID特性。 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对...
  • 数据库事务处理

    千次阅读 2020-06-02 22:55:57
    数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。 数据库...
  • 数据库事务和spring事务的区别

    千次阅读 2022-03-17 11:45:24
    数据库事务和spring事务 本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的.数据库的事务说简单就只有开启,回滚和关闭,...
  • 数据库事务管理

    万次阅读 2019-11-16 19:03:12
    java数据库事务管理原理 --------------------------------------------------------------------------------------------------------------------------------------------------------------- 1、事务概念...
  • 可以帮助读者迅速了解数据库事务以及事务的介绍能为以后的开发提供一些实际操作的经验。
  • 数据库事务与连接池

    千次阅读 2021-12-03 09:51:29
    数据库事务 数据库事务介绍 1.事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。 2. 事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改 变这种执行方式。当在一...
  • 使用Spring框架实现数据库事务处理

    千次阅读 2020-03-02 21:20:45
    企业级应用系统在更新数据库数据时,一般都采用数据库事务处理,以确保数据库数据的一致性。本文主要讨论在Spring框架中如何使用数据库事务处理更新数据库数据。通过本课的学习,可以达到如下目标。 ● 了解JDBC对...
  • 数据库事务实现原理

    千次阅读 2020-03-07 22:05:32
    数据库事务 1. 定义 数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。 2. 典型特性 典型特性有原子性...
  • Spring中的事务及数据库事务的关系

    千次阅读 2019-06-13 17:23:24
    Spring中的事务及数据库事务的关系 一、MySQL中的事务 如果对MySQL中的事务不了解的话,请先看 基于MySQL 8.0 对事务的深度理解 二、Spring中的事务 Spring管理事务的方式 编程式事务 编程式事务就是利用手动...
  • 数据库事务的四大特性和隔离级别
  • 数据库事务&存储过程

    千次阅读 2019-02-28 15:58:24
    一、【事务概念】 事务(Transaction)是指构成单一逻辑...2,同时,该事务数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。 二、【事务举例】 用一个常用的“A 账户向 B 账户汇钱”的例子来说...
  • 数据库事务ACID原则学习分享

    千次阅读 2019-05-12 16:12:40
    Jim Gray 詹姆士·格雷,数据库界三位图灵奖获得者之一,他为数据库最大贡献之一就是就是开创了数据库事务的多数重要理论,并在1983年,由 Andreas Reuter和Theo Härder 创造了数据库事务四大原则ACID来描述数据库...
  • MySQL数据库事务及其原理

    千次阅读 2018-10-18 22:04:48
    MySQL 事务主要用于处理操作量大,复杂度高的数据。 银行转账是经典的解释事务的例子。用户A给用户B转账5000元主要步骤可以概括为如下两步。  第一,账户A账户减去5000元;  第二,账户B账户增加5000元;  这两步...
  • 数据库事务

    万次阅读 2019-12-16 10:46:25
    事务: 一组逻辑操作单元,使数据从一种状态变换到另一种状态。...要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。 为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单...
  • 数据库事务 最全详解-----

    万次阅读 多人点赞 2018-08-02 23:04:00
    一、事务的概念  事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。  例如:A——B转帐,对应于如下两条sql语句  update from account set money=money+100 where name='B';  ...
  • Spring事务与数据库事务的交互原理

    千次阅读 2021-01-27 11:01:33
    Spring事务和数据库事务到底是什么关系?Spring事务是如何传递到数据库的?首先,我们来回忆一下jdbc这个api,这是java操作数据库的入口,是java操作数据库的通道,是我们与数据库打交道的必经之路。那么,是不是说...
  • 数据库事务隔离的四个级别

    千次阅读 2020-11-02 09:51:57
    **数据库隔离级别:**是在在数据库操作中,为了有效保证并发读取数据的正确性提出的。 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也...**READ UNCOMMITTED(读未提交数据):**允许事务读取未
  • 数据库事务的三种提交方式介绍

    千次阅读 2021-04-12 19:45:41
    文章目录数据库事务提交的三种方式:为什么需要隐式提交:通过不同的数据库介绍自动提交和手动提交: 数据库事务提交的三种方式: 显式提交、隐式提交及自动提交。 参考:...
  • spring事务与数据库事务的区别

    千次阅读 2019-10-08 18:59:23
    事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务事务开始(begin transac...
  • 数据库事务的并发问题上我们往往会看到脏写、脏读、不可重复读以及幻读这样的问题。希望大家多多支持,我也会经常的对博客进行更新,并对一些新的技术或者新的特性进行持续的更新。如果你喜欢的话就点个赞收藏一下...
  • MySQL数据库事务处理

    万次阅读 多人点赞 2017-03-16 15:43:33
    事务处理用于有效记录某机构感兴趣的业务活动(称为事务)的数据处理(例如销售、供货的定购或货币传输)。...本文对数据库事务处理相关的存储引擎、事务处理的概念、分离水平、以及死锁进行简单介绍。
  • 简述数据库事务并发机制

    万次阅读 多人点赞 2017-04-21 11:17:34
    事务是最小的逻辑执行单元,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务具有四个重要特征,即原子性、一致性、隔离性和持久性。本文首先叙述了数据库事务...
  • 前言 Spring事务部分之前一直理解的模棱两可,在实际开发中这些都由架构师完成,底层程序员更多的只是编写...在spring数据库事务中,可以使用编程式事务和声明式事务,但是编程式事务需要手动编写事务的提交和回滚...
  • 数据库事务的四大特性(ACID)

    万次阅读 2019-06-18 17:10:04
    数据库事务的四大特性 1, 什么是数据库事务? 数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 意思就是一连串的数据库操作,即一串增删查改的集合。 2, 数据库事务做了什么? ...
  • 数据库 事务级别介绍

    千次阅读 2018-03-30 12:30:54
    数据库 事务级别介绍 2个概念:事务,锁。 事务:逻辑单元内的一系列操作,要么全部完成执行,要么全部不执行。 锁:将某数据的操作加锁,则其他人无法获取当前数据的当前操作。避免单位时间内的数据覆盖,影响...
  • 在Spring Boot中使用数据库事务

    万次阅读 2017-01-05 22:38:23
    我们在前面已经分别介绍了如何...那么关于数据库访问还有一个核心操作那就是事务的处理了,前面两篇博客小伙伴们已经见识到Spring Boot带给我们的巨大便利了,其实不用猜,我们也知道Spring Boot在数据库事务处理问题上

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 937,000
精华内容 374,800
关键字:

数据库事物