精华内容
下载资源
问答
  • 数据库事务处理
    千次阅读
    2017-07-28 15:04:56

    数据库事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做要么全不做,是一个不可分割的工作单位。
    数据库事务的四大特性(简称ACID)是:
    (1) 原子性(Atomicity)
    事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据修改操作要么全部执行,要么完全不执行。这种特性称为原子性。
    例如银行取款事务分为2个步骤(1)存折减款(2)提取现金。不可能存折减款,却没有提取现金。2个步骤必须同时完成或者都不完成。
    (2)一致性(Consistency)
    事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。这种特性称为事务的一致性。假如数据库的状态满足所有的完整性约束,就说该数据库是一致的。
    例如完整性约束a+b=10,一个事务改变了a,那么b也应随之改变。
    (3)分离性(亦称独立性Isolation)
    分离性指并发的事务是相互隔离的。即一个事务内部的操作及正在操作的数据必须封锁起来,不被其它企图进行修改的事务看到。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。
    (4)持久性(Durability)
    持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性通过数据库备份和恢复来保证。

    更多相关内容
  • 数据库事务处理

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

    1、简介

           数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

           数据库事务是一个逻辑上的划分,有的时候并不是很明显,它可以是一个操作步骤也可以是多个操作步骤。我们可以这样理解数据库事物:对数据库所做的一系列修改,在修改过程中,暂时不写入数据库,而是缓存起来,用户在自己的终端可以预览变化,直到全部修改完成,并经过检查确认无误后,一次性提交并写入数据库,在提交之前,必要的话所做的修改都可以取消。提交之后,就不能撤销,提交成功后其他用户才可以通过查询浏览数据的变化。

           经典案例:银行转账,第一步骤从第一个账户划出款项,第二步骤将款项存入第二个账户。在这个过程中,两个环节是关联的。第一个账户划出款项必须保证正确的存入第二个账户,如果第二个环节没有完成,整个的过程都应该取消,否则就会发生丢失款项的问题。整个交易过程,可以看作是一个事物,成功则全部成功,失败则需要全部撤消,这样可以避免当操作的中间环节出现问题时,产生数据不一致的问题。

     

    2、性质(ACID)

    • 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。
    • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。
    • 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
    • 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

           事务的ACID特性是由关系数据库系统(DBMS)来实现的,DBMS采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所作的更新,如果某个事务在执行过程中发生错误,就可以根据日志撤销事务对数据库已做的更新,使得数据库同滚到执行事务前的初始状态。

           对于事务的隔离性,DBMS是采用锁机制来实现的。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

     

    3、作用

    • 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
    • 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

     

    4、数据库事务处理相关命令

    进行的操作

    命令

    查看存储引擎

    SHOW CREATE TABLE 表名;

    更改引擎

    ALTER TABLE 表名 ENGINE=新引擎名;

    回滚

    ROLLBACK;

    声明事务开始

    BEIGIN;

    事务提交

    COMMIT;

    查询自动提交功能状态

    SELECT @@AUTOCOMMIT;

    设置自动提交功能

    SET AUTOCOMMIT=0或1;

    设置分离水平

    SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

     

    5、存储引擎

           MySQL数据库的存储引擎是可以选择改变和替换的(可替换存储引擎构架,Pluggable Storage Engine Architecture)。MySQL主要有8种存储引擎:

    存储引擎

    特征

    MyISAM

    高速引擎,不支持事务处理

    InnoDB

    支持行锁定以及事务处理,速度比MyISAM稍慢

    ISAM

    MyISAM的前身

    MERGE

    将多个MyISAM类型的表作为一个表来处理的引擎

    MEMORY,HEAP

    只在内存上保存数据

    Falcon

    一种新的存储引擎,支持事务处理

    ARCHIVE

    将数据压缩后保存(只能支持INSERT/SELECT操作

    CSV

    以CSV形式保存数据(应用于跨平台数据交换)

     

    6、事务处理

           之前讲到,事务处理是一毁全毁,因此事务中任意一个任务或指令失败,整个事务都将失败。那是怎么实现的呢?方法是时间中多个任务全部成功,则任务成功结束,并且会进行提交(COMMIT),如果任何一件任务失败,则强制回滚(ROLLBACK)到初始状态。

           事务处理涉及到三个最重要的命令:BEGIN,ROLLBACK,COMMIT,分别表示声明事务开始,回滚,确认提交

    (1)回滚

    事务在BEGIN之后但还没COMMIT的时候可以用ROLLBACK回滚到BEGIN之前的数据,而如果COMMIT提交之后则不能用ROLLBACK回滚到原来的数据。

    (2)自动提交

    当搜索引擎为MyISAM时,因为不支持事务处理,因此命令一旦执行,就一定会提交,这种默认的提交方式被称为自动提交。

           而当搜索引擎设置为InnoDB时,可以设置自动提交功能是否开启,当自动提交功能为ON时,命令执行就会提交(COMMIT),而自动提交设置为OFF 时,必须执行COMMIT才提交,可以使用ROLLBACK进行回滚。

    查询当前自动提交功能状态:

    SELECT @@AUTOCOMMIT;
    

    设置自动提交功能:

    SET AUTOCOMMIT=0或1;
    

    (3)部分回滚

           直接ROLLBACK会回滚到BEGIN开始之前的地方,而通过SAVEPOINT可以保存一个点,通过ROLLBACK TO SAVEPOINT就可以回滚到保存点了,也就实现了“想去哪就去了哪”。

    部分回滚主要有两个步骤:

    ①保存点

    SAVEPOINT 保存点名;
    

    ②回滚到保存点

    ROLLBACK TO SAVEPOINT 保存点名;
    

    (4)不能事务处理的命令(直接提交)

           大部分命令都可以通过事务处理(BEGIN -ROLLBACK- COMMIT)进行操作,但是:

    • DROP DATABASE;
    • DROP TABLE;
    • DROP;
    • ALTER TABLE

    不能通过事务处理,会直接COMMIT;

     

    7、锁定与事务处理

    (1)锁定

    (a)锁定的分类

           锁定分为共享锁定(Shared Lock)和排他锁定(Exclusive Lock):

    • 共享锁定是将对象数据变为只读形式,不能进行更新,所以也称为读取锁定;
    • 排他锁定是当执行INSERT/UPDATE/DELETE的时候,其它事务不能读取该数据,因此也称为写入锁定。

    (b)锁定的粒度

           锁定对象的大小是锁定的粒度,有三种粒度:

    • 记录
    • 数据库

    (2)事务处理的分离水平

           需要使用锁定来有效解决事务冲突的情况,但是锁定也会使性能下降(因为别人无法访问),因此频繁锁定不一定合理,数据库中,使用分离水平来表示事务处理之间的影响程度。

           事务处理的分离水平对应的数据整合情况:

    分离水平

    非提交读取

    不可重复读取

    幻象读取

    READ UNCOMMITED

    READ COMMITED

    ×

    REPEATABLE READ

    ×

    ×

    SERIALIZABLE

    ×

    ×

    ×

    设置分离水平可以使用命令:

    SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;
    

    (a)非提交读取

           非提交读取指的是别的事务能够读取到还没有提交的更新数据,只发生在分离水平为READ UNCOMMITED的情况下。

           因为对事务处理的读取没有任何限制,所以一般不推荐使用。

    (b)不可重复读取

           不可重复读取是指在某事务处理过程中对数据进行读取,由于该事务更新操作导致多次读取数据时发生了改变。

           不可重复读取发生在READ COMMITED 一下的分离水平。

    (c)幻象读取

           幻象读取指的是,在某事物处理数据过程中对数据多次读取,由于该事务的插入/删除操作而导致在多次读取过程中读取到不存在或者消失的数据。

           当设置分离水平为SERIALIZABLE时,可以消除幻象读取。

    (3)死锁 Dead Lock

           死锁指的是两个事务互相对待对方释放锁定,则永远也不可能接触锁定的状态。

     

    参考:https://blog.csdn.net/moxigandashu/article/details/62046030

     

    展开全文
  • SQL与Oracle对数据库事务处理的差异性.docx
  • Oracle管理SQL 和Oracle对数据库事务处理的差异性 SQL和Oracle对数据库事务处理的差异性 作者:Jake,出处:IT专家网论坛,责任编辑:陈子琪, 2009-10-1113:00 在吉日嘎拉的软件编程走火入魔之数据库事务处理入门(适合...
  • 数据库事务处理课件

    2011-10-23 21:12:25
    共计132页的ppt,详细讲述数据库事务处理技术
  • 使用Spring框架实现数据库事务处理

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

    企业级应用系统在更新数据库数据时,一般都采用数据库事务处理,以确保数据库数据的一致性。本文主要讨论在Spring框架中如何使用数据库事务处理更新数据库数据。通过本课的学习,可以达到如下目标。

    ● 了解JDBC对数据库事务处理的支持

    ● 掌握在Spring框架中使用事务处理的技术

    事务处理对数据库来说,是对数据库的一系列SQL语句操作,这些操作被组织为一个事务。事务具有原子性,即事物中的操作要么全部执行,要么全部不执行。若事务中的SQL语句在执行过程中发生错误,事务需要对已经执行的SQL语句进行回滚操作,撤销先前对数据库的操作,防止数据库出现错误状态。

    例如,在课程案例mooc数据库中,一个业务是学生购买课程,购买课程业务步骤包括更新teacher表,记录老师的收入,同时student_course表增加一条购买记录,更新student表的余额字段。上述业务步骤需要全部执行完毕,才能反映出学生购买课程的正确状态。如果因意外情况,上述操作仅成功执行了部分SQL语句,其它语句没有执行或执行失败,就会造成学生购买课程这个业务记录不完整,数据库处于数据错乱状态。若利用数据库事务技术执行上述操作,当发生上述情况时,数据库系统会将先前执行的SQL语句撤销,将数据库回滚到事务执行前状态。

     

    1、JDBC对数据库事务处理的支持

    JDBC本身就提供了对数据库事务处理的支持,使用java.sql.Connection对象完成事务的提交。使用Connection提交数据库事务处理代码如下。

     

    Connection类的setAutoCommit方法用于设置JDBC提交SQL语句的方式。设置为ture时,JDBC自动提交SQL语句,JDBC提交SQL语句的方式默认为true。设置为false时,SQL语句的提交由应用程序负责,应用程序必须调用commit方法,同时要在执行SQL语句异常处理块中调用rollback方法,对异常发生前进行的数据库进行回滚操作。

    在企业级应用中,事务一般是并发执行的,当事务并发执行时,就会发生数据库数据同步的问题,具体问题可分为下面四种类型。

    (1)脏读:一个数据库事务在更新数据的过程中,数据是保存在内存中的,只有调用commit方法,更新的数据才最终写到数据库中。如果一个事务使用了另一个事务更新但没保存的数据,这个数据就称为脏数据,事务读取这个数据就称为脏读。

    (2)不可重复读:在同一事务中,两次读取同一记录,读取的记录内容却不相同。例如,事务A第一次读取了一条记录,同时事务B更新并提交了该条记录,事务A第二次读取该条记录时,当前读取的记录内容和第一次读取的记录内容不相同。

    (3)幻读:当事务A对表中的所有记录进行了修改,同时事务B又在表中插入了一条新的记录。A事务在后续对该表操作时,就会发现表中还存在没有修改的记录,就好象发生了幻觉一样。

    (4)丢失更新:当事务A和事务B对同一数据进行修改时,就会发生丢失更新的问题。例如,B事务对m记录进行了修改,A事务在修改m记录时发生异常并回滚,就会将B事务对m记录的修改覆盖掉。

    为了解决上面提到的事务并发问题,JDBC定义了五种事务隔离级别来解决来解决这些并发导致的问题。

    表1 JDBC提供的事务隔离级别说明

     

    表中隔离级别从上到下依次增高,最高级别是TRANSACTION_SERIALIZABLE,它通过强制事务串行执行(不是并行),避免了事务并发执行导致发生的数据同步问题。出于应用程序访问数据库性能的考虑,一般设置隔离级别为TRANSACTION_READ_COMMITTED。

     

    2、在Spring框架中调用事务处理

    下面给出具体执行事务处理的案例程序。案例程序的数据源采用mooc数据库,mooc数据库的结构以及本案例中没有列出的代码详见《Spring使用JDBC访问MySQL数据库》一文。

    让Spring框架开始执行一个数据库事务时,需要分成三步走。第一步配置数据源DataSource;第二步声明事务管理TransactionManager类;第三步定义可以执行事务的DAO类。

    第一步:配置数据源DataSource

    需要让Spring框架知道数据库的位置及其连接方式,这个工作由DataSource完成。Spring框架通过DataSource连接数据库,DataSource既可以在Spring框架的配置文件中配置,也可以放在Bean类中配置。下面是在Spring配置文件中配置数据源的代码。

     

    配置语句定义了MySQL数据库的URL地址、访问账户及访问密码。

    第二步:声明事务管理TransactionManager

    Spring 框架提供了PlatformTransactionManager作为事务管理类的顶层接口,声明了初始化事务、提交事务、回滚事务等接口。接口实现由具体的数据库驱动类实现。具体包括DataSourceTransactionManager、HibernateTransactionManager等实现类。本文主要用DataSourceTransactionManager来实现事务的管理。在Spring框架配置文件中配置DataSourceTransactionManager类。

     

    声明DataSourceTransactionManager类,需要传入之前已声明的DataSource数据源。

    第三步:定义可以执行事务的DAO类

    DAO提供了应用程序访问数据源必要的接口和方法,接口和方法的具体实现细节,程序并不需要了解。DAO的具体细节详见《Spring使用JDBC访问MySQL数据库》一文。

     

    CourseTransactio类实现了CourseDao接口,CourseDao是访问mooc数据库的顶层接口,接口提供了mooc数据库表的增删改查操作。CourseTransactio主要实现了CourseDao类的buyCourse,实现学生购买课程事务。购买课程事务涉及到更新teacher表,在student_course表增加一条购买记录,更新student表的余额字段数据库操作,这些操作需要进行连续处理,中间不能中断出错,如果出错则需要做回滚处理。 因此,buyCourse方法采用数据库事务进行处理。

    事务处理从TransactionDefinition开始,前面我们谈到了事务的隔离级别,TransactionDefinition就是用来定义事务隔离级别的。DefaultTransactionDefinition表示使用数据库的默认隔离级别,对大部分数据库而言,默认隔离级别是TRANSACTION_READ_COMMITTED。

    当TransactionDefinition 创建后,可以通过调用 getTransaction方法开始事务,该方法会返回 TransactionStatus 的一个实例。 TransactionStatus 用于追踪当前的事务状态,如果后面的SQL语句都运行成功,可以使用 TransactionManager 的 commit() 方法来提交这个事务,否则使用 rollback() 方法来回滚整个操作。

    完整的配置文件代码。

     

    学生实体类代码。

     

     

    老师实体类代码。

     

    student表映射到学生实体类。

     

    teacher表映射到老师实体类。

     

    测试类代码。

     

    课程小结

    (1)事务处理对数据库来说,是对数据库的一系列SQL语句操作,这些操作被组织为一个事务。事务具有原子性,即事物中的操作要么全部执行,要么全部不执行。若事务中的SQL语句在执行过程中发生错误时,事务需要对已经执行的SQL语句进行回滚操作,撤销先前对数据库的操作,防止数据库出现错误状态。

    (2)让Spring框架开始执行一个数据库事务时,需要分成三步走。第一步配置数据源DataSource;第二步声明事务管理TransactionManager类;第三步定义可以执行事务的DAO类。

    展开全文
  • 翻译的 数据库事务处理-带书签pdf完整版本,非PPT
  • MySQL数据库事务处理

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

    事务处理用于有效记录某机构感兴趣的业务活动(称为事务)的数据处理(例如销售、供货的定购或货币传输)。通常,联机事务处理 (OLTP) 系统执行大量的相对较小的事务。——百度百科

    事务处理是将多个操作或者命令一起执行,所有命令全部成功执行才意味着该事务的成功,任何一个命令失败都意味着该事务的失败。

    以银行转账为例(100块都不给),
    A要给B 转账100元,
    A转账的指令已经成功发出,而B 由于未知的原因接收失败,
    如果两个命令单独执行,那么A账户少了100块,但是B又没收到100块,显而易见是不合理的;
    如果将A向B 转账100元当成一个事务处理,那么由于B 接收的失败,整个转账事务都将失败,A不会少100,B更不会增加100,这个时候“100块都不给”才是合理的情况。
    事务处理

    因此,事务处理是不是一荣俱荣,而是一毁全毁。

    接下来介绍MySQL数据库中如何进行事务处理以及锁定。

    0 数据库事务处理相关命令

    进行的操作命令
    查看存储引擎SHOW CREATE TABLE 表名;
    更改引擎ALTER TABLE 表名 ENGINE=新引擎名;
    回滚ROLLBACK;
    声明事务开始BEIGIN;
    事务提交COMMIT;
    查询自动提交功能状态SELECT @@AUTOCOMMIT;
    设置自动提交功能SET AUTOCOMMIT=0或1;
    设置分离水平SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

    1 存储引擎

    MySQL数据库的存储引擎是可以选择改变和替换的(可替换存储引擎构架,Pluggable Storage Engine Architecture)。MySQL主要有8种存储引擎:

    存储引擎特征
    MyISAM高速引擎,不支持事务处理
    InnoDB支持行锁定以及事务处理,速度比MyISAM稍慢
    ISAMMyISAM的前身
    MERGE将多个MyISAM类型的表作为一个表来处理的引擎
    MEMORY,HEAP只在内存上保存数据
    Falcon一种新的存储引擎,支持事务处理
    ARCHIVE将数据压缩后保存(只能支持INSERT/SELECT操作
    CSV以CSV形式保存数据(应用于跨平台数据交换)

    MySQL的存储引擎种类和特征

    (1)查看存储引擎 SHOW CREATE TABLE 表名;
    查看某表使用的存储引擎,语法代码如下:

     `SHOW CREATE TABLE 表名;`

    如,要查看表customer的存储引擎,可以输入代码:

     `SHOW CREATE TABLE customer;`

    查看存储引擎
    如图表所示ENGINE=后面显示的就是存储引擎。

    (2)更改存储引擎ALTER TABLE 表名 ENGINE=新引擎名;

    若要更改存储引擎,可以使用代码:

    >ALTER TABLE 表名 ENGINE=新引擎名;

    eg:将表customer的存储引擎修改为MyISAM,输入指令:

    ALTER TABLE customer ENGINE=MyISAM;

    更改存储引擎

    2 事务处理

    之前讲到,事务处理是一毁全毁,因此事务中任意一个任务或指令失败,整个事务都将失败。那是怎么实现的呢?方法是时间中多个任务全部成功,则任务成功结束,并且会进行提交(COMMIT),如果任何一件任务失败,则强制回滚(ROLLBACK)到初始状态。

    事务处理涉及到三个最重要的命令:BEGIN,ROLLBACK,COMMIT,分别表示声明事务开始,回滚和确认提交。

    (1)回滚演示(ROLLBACK)
    首先将表格customer 的存储引擎设置为InnoDB,
    确认表格数据;SELECT * FROM customer;
    事务开始;BEGIN;
    删除表格数据;DELETE FROM customer;
    再次查看表格数据;SELECT * FROM customer;
    回滚到初始状态;ROLLBACK;
    再次查看表格数据;SELECT * FROM customer;

    回滚
    可以看到,当执行ROLLBACK;之后,删除的记录又恢复到了BEGIN之前的状态,如果将ROLLBACK 换成COMMIT,那么事务将会提交,删除的记录就不能恢复了。

    (2)自动提交

    当搜索引擎为MyISAM时,因为不支持事务处理,因此命令一旦执行,就一定会提交,这种默认的提交方式被称为自动提交

    而当搜索引擎设置为InnoDB时,可以设置自动提交功能是否开启,当自动提交功能为ON时,命令执行就会提交(COMMIT),而自动提交设置为OFF 时,必须执行COMMIT才提交,可以使用ROLLBACK进行回滚。

    查询当前自动提交功能状态:

    >SELECT @@AUTOCOMMIT;

    设置自动提交功能:

    >SET AUTOCOMMIT=0或1;

    如图,将自动提交设置为OFF,插入一条记录,然后使用回滚ROLLBACK,再次查看记录,会发现不见了。
    自动提交

    (3)部分回滚 SAVEPOINT

    直接ROLLBACK会回滚到BEGIN开始之前的地方,而通过SAVEPOINT可以保存一个点,通过ROLLBACK TO SAVEPOINT就可以回滚到保存点了,也就实现了“想去哪就去了哪”。
    部分回滚

    部分回滚主要有两个步骤:
    ①保存点

    >SAVEPOINT 保存点名;

    ②回滚到保存点

    >ROLLBACK TO SAVEPOINT 保存点名;

    eg:
    mysql部分回滚

    (4)不能事务处理的命令(直接提交)
    大部分命令都可以通过事务处理(BEGIN -ROLLBACK- COMMIT)进行操作,但是:

    • DROP DATABASE;
    • DROP TABLE;
    • DROP;
    • ALTER TABLE

    不能通过事务处理,会直接COMMIT;

    3 锁定与事务处理

    前面讲到的ROLLBACK 等操作指令都是基于一个用户进行的。但是事务类型往往不只一个用户,多个用户同时操作,如被人广泛诟病的“12306”火车票购票系统,全国各地的售票窗口以及互联网购票注册账户,成千上万的用户同时使用,因此事务处理必须能够处理多个用户同时操作的情况,这就需要锁定。

    举个例子,如果某班火车只剩最后一张票,A和B 同时登陆网站购票,得到的反馈是还剩一张,于是A,B 都赶紧下单,处理这种冲突事件,就需要对该事务进行锁定(LOCK),接触锁定被称为解锁(Unlock)

    锁定

    3.1 锁定

    (1)锁定的分类

    锁定分为共享锁定(Shared Lock)和排他锁定(Exclusive Lock):

    • 共享锁定是将对象数据变为只读形式,不能进行更新,所以也成为读取锁定;
    • 排他锁定是当执行INSERT/UPDATE/DELETE的时候,其它事务不能读取该数据,因此也成为写入锁定。

    (2)锁定的粒度

    锁定对象的大小是锁定的粒度,有三种粒度:

    • 记录
    • 数据库

    3.2 事务处理的分离水平

    需要使用锁定来有效解决事务冲突的情况,但是锁定也会使性能下降(因为别人无法访问),因此频繁锁定不一定合理,数据库中,使用分离水平来表示事务处理之间的影响程度。

    事务处理的分离水平对应的数据整合情况:

    分离水平非提交读取不可重复读取幻象读取
    READ UNCOMMITED
    READ COMMITED×
    REPEATABLE READ××
    SERIALIZABLE×××

    设置分离水平可以使用命令:

    >SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;


    为了模拟多个用户对数据库进行访问和操作,我们打开两个命令窗口接入MySQL。
    (1)非提交读取

    非提交读取指的是别的事务能够读取到还没有提交的更新数据,只发生在分离水平为READ UNCOMMITED的情况下。

    因为对事务处理的读取没有任何限制,所以一般不推荐使用。

    eg:
    非提交读取

    两个窗口的执行顺序如图红色序号所示:
    ①首先再A窗口对Id为g001的记录的nam进行修改;
    ②然后B进行访问,发现已经能够读取新的nam;
    ③A执行ROLLBACK,回滚到初始状态(nam恢复原来的记录);
    ④B再次查询,又得到OLD记录(旧记录);
    ⑤A再次UPDATE,并COMMIT;
    ⑥B再次SELECT,得到新纪录(new)。
    可以看到,当A还没提交,B就可以看到更新的数据,这个时候很可能出现问题,比如A后来执行ROLLBACK,B看到的数据实际上是错误的数据。

    (2)不可重复读取

    不可重复读取是指在某事务处理过程中对数据进行读取,由于该事务更新操作导致多次读取数据时发生了改变。

    不可重复读取发生在READ COMMITED 一下的分离水平。

    eg:
    不可重复读取
    命令顺序依然如图红色数字所示:
    ①A更新id为g001的nam;
    ②B查询,结果是OLD数据;
    ③A提交更新;
    ④B再次查询,得到更新后的NEW数据。
    B先后两次查询,结果不一致。

    (3)幻象读取

    幻象读取指的是,在某事物处理数据过程中对数据多次读取,由于该事务的插入/删除操作而导致在多次读取过程中读取到不存在或者消失的数据。

    下图是幻象读取发生的例子:

    幻象读取发生
    ①A事务开始;
    ②B查询;
    ③A插入一条记录并提交;
    ④B再次查询;
    可以看到B连续执行两次的查询,前后结果不一致。

    当设置分离水平为SERIALIZABLE时,可以消除幻象读取。

    消除幻象读取
    ①A事务开始;
    ②B查询;
    ③A插入一条数据;(此时A会一直等待,直到B提交)
    ④B提交;
    ⑤A提交;
    ⑥B再次查询;

    特别需要注意的是,由于B正在读取数据,当A 执行插入命令时,无法立马得到结果,而是一直等待,直到B提交。当B提交时,A的插入命令自动完成。

    3.3 死锁 Dead Lock(狭路相逢勇者胜)

    死锁指的是两个事务互相对待对方释放锁定,则永远也不可能接触锁定的状态。

    如A,B两个用户都对表customer中记录’g001’和’g002’实施了排他锁定,由于两个事务互相等待对方释放锁定,所以形成了死锁。
    死锁
    A和B执行命令顺序红色字体所示:
    ①A事务开始,并对’g001’进行了更新;
    ②B事务开始,并对’g002’进行了更新;
    ③A对’g002’进行更新;(A等待B提交释放锁定)
    ④B对’g001’进行更新;(B等待A提交释放锁定,A、B互相等待陷入死锁)

    此时,MySQL数据库让B强制解除锁定,A继续执行;

    ⑤A提交;
    ⑥B回滚并查询,得到A事务更新的数据;

    展开全文
  • 【MySQL】数据库事务处理---MySQL

    千次阅读 2018-07-01 23:45:50
    事务处理用于有效记录某机构感兴趣的业务活动(称为事务)的数据处理(例如销售、供货的定购或货币传输)。通常,联机事务处理 (OLTP) 系统执行大量的相对较小的事务----百度百科。事务处理是将多个操作或者命令一起...
  • 海翔在数据库管理系统领域的第二本著作《数据库事务处理的艺术:事务管理与并发控制》马上就要出版了,他邀请我写个序,我没有犹豫就欣然答应了。事后,我自己都觉得奇怪会这么痛快,但细细想来,还是有充分理由的。...
  • 数据库事务处理

    2019-04-30 17:45:06
    数据库事务处理
  • 数据库事务(个人理解)

    千次阅读 2022-03-21 11:23:02
    事务个人理解
  • ASP实现数据库事务处理的方法

    千次阅读 2014-04-25 16:41:49
    受应用逻辑的影响,有 时需要将多条数据库操作指令组成一个工作单元(事务)。在数据库中,所谓事务是指一组逻辑操作单元,它使数据从一 种状态变换到另一种状态。为确保数据库中数据的一致性,应当用离散的成组的逻辑...
  • 分布式数据库事务处理(COM+实现)
  • 前言 Spring事务部分之前一直理解的模棱两可,在实际开发中这些都由架构师完成,底层程序员更多的只是编写...在spring数据库事务中,可以使用编程式事务和声明式事务,但是编程式事务需要手动编写事务的提交和回滚...
  • 8.1 并发控制概述 8.2 封锁 8.3 封锁协议 8.4 活锁和死锁 8.5 并发调度的可串行性 8.6 两段锁协议 8.7 封锁的粒度 8.8 Oracle的并发控制 8.9 小结
  • 在spring工程中 中使用@Transactional实现事务,经常会出现事务失效的现象,是因为用@Transactional实现事务有特殊的要求: 1、只能是bean对象的public接口使用@Transactional 2、只能通过bean对象使用@...
  • 数据库事务的四大特性

    千次阅读 2019-12-04 11:10:34
    事务的四大特性(ACID)如下 1. 原子性(Atomicity): 原子性是指事务包含的...* 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态 ** 3. 隔离性(Isolation)????* ** 4. 持久性(Durability)????* ...
  • 数据库事务处理.rar,数据库事务处理.pdf
  • 数据库事务处理的设计
  • 第6章 聊聊数据库事务处理 在互联网数据库的使用中,对于那些电商和金融网站,最关注的内容毫无疑问就是数据库事务,因为对于热门商品的交易和库存以及金融产品的金额,是不允许发生错误的。但是它们面临的问题是,...
  • 数据到了多机后,原来单机中通过事务进行处理逻辑会有很大影响,要么放弃原来的单机事务,修改实现,要么引入分布式事务。 b、一些join操作会变得比较困难,因为数据可能已经在两个数据库中了。 c、靠外键去进行...
  • PHP跨数据库事务处理

    千次阅读 2014-06-24 16:36:56
    我答:只要是Web程序,大部分都没啥问题。... 我无言以对(因为我不懂a)  ... 为此我小小地分析了一下跨数据库事务的方方面面。  Mysql完成一个完整xa事务的典型过程。  Sql代码  XA START
  • 数据库事务的概念及其实现原理

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 577,871
精华内容 231,148
关键字:

数据库事务处理