新闻中心

oracle 事务

oracle 事务

Oracle数据库之事务 - MrZhaoFei - 博客园

在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。

如:网上转帐就是典型的要用事务来处理,用以保证数据的一致性。

SQL92标准定义了数据库事务的四个特点:

一组SQL语句操作要成为事务,数据库管理系统必须保证这组操作的原子性(Atomicity)、一致性(consistency)、隔离性(Isolation)和持久性(Durability),这就是ACID特性。

因为Oracle中支持多个事务并发执行,所以会出现下面的数据异常。

当一个事务修改数据时,另一事务读取了该数据,但是第一个事务由于某种原因取消对数据修改,使数据返回了原状态,这是第二个事务读取的数据与数据库中数据不一致,这就叫脏读。

如:事务T1修改了一条数据,但是还未提交,事务T2恰好读取到了这条修改后了的数据,此时T1将事务回滚,这个时候T2读取到的数据就是脏数据。

是指一个事务读取数据库中的数据后,另一个事务则更新了数据,当第一个事务再次读取其中的数据时,就会发现数据已经发生了改变,这就是不可重复读取。不可重复读取所导致的结果就是一个事务前后两次读取的数据不相同。

如:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同。

如果一个事务基于某个条件读取数据后,另一个事务则更新了同一个表中的数据,这时第一个事务再次读取数据时,根据搜索的条件返回了不同的行,这就是幻读。

如:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻读。

事务中遇到的这些异常与事务的隔离性设置有关,事务的隔离性设置越多,异常就出现的越少,但并发效果就越低,事务的隔离性设置越少,异常出现的越多,并发效果越高。

针对读取数据时可能产生的不一致现象,在SQL92标准中定义了4个事务的隔离级别:

Oracle默认的隔离级别是read committed。

Oracle支持上述四种隔离级别中的两种:read committed 和serializable。除此之外,Oralce中还定义Read only和Read write隔离级别。

Read only:事务中不能有任何修改数据库中数据的操作语句,是Serializable的一个子集。

Read write:它是默认设置,该选项表示在事务中可以有访问语句、修改语句,但不经常使用。

设置一个事务的隔离级别:

注意:这些语句是互斥的,不能同时设置两个或两个以上的选项。

设置单个会话的隔离级别:

在执行使用

语句可以提交事务,当执行了COMMIT语句后,会确认事务的变化,结束事务,删除保存点,释放锁。当使用COMMIT语句结束事务之后,其他会话将可以查看到事务变化后的新数据。

保存点(savepoint):是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行ROLLBACK时,通过指定保存点可以回退到指定的点。

设置保存点:

删除保存点:

回滚部分事务:

回滚全部事务:

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改;加了共享锁的数据对象可以被其他事务读取,但不能修改。

根据保护对象的不同,Oracle数据库锁可分为:

在Oracle中最主要的锁是DML锁,DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。

锁出现在数据共享的场合,用来保证数据的一致性。当多个会话同时修改一个表时,需要对数据进行相应的锁定。

锁有“共享锁”、“排它锁”,“共享排它锁”等多种类型,而且每种类型又有“行级锁” (一次锁住一条记录),“页级锁” (一次锁住一页,即数据库中存储记录的最小可分配单元),“表级锁” (锁住整个表)。

可通过lock table in share mode命令添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出select …from for update命令对表添加RS锁。

可通过lock table in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。

通常是通过select … from for update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。比如,当我们在查询某些记录的过程中,不希望其他用户对查询的记录进行更新操作,则可以发出这样的语句。当数据使用完毕以后,直接发出rollback命令将锁定解除。当表上添加了RS锁定以后,不允许其他事务对相同的表添加排他锁,但是允许其他的事务通过DML语句或lock命令锁定相同表里的其他数据行。

当进行DML操作时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。在该锁定模式下,允许其他的事务通过DML语句修改相同表里的其他数据行,或通过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。

通过lock table in share row exclusive mode命令添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。

上述几种锁模式中,RS锁是限制最少的锁,X锁是限制最多的锁。它们的兼容关系如下:

基本上所有的锁都可以由Oracle内部自动创建和释放,但是其中的DDL和DML锁是可以通过命令进行管理的,命令语法:

下图列出产生锁定模式的SQL语句:

当程序对所做的修改进行提交(Commit)或回滚(Rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁

几乎所有的数据库管理系统中,事务管理的机制都是通过使用日志文件来实现的,我们来简单介绍一下日志的工作方式。

当用户执行一条修改数据库的DML语句时,DBMS自动在日志文件中写一条记录,显示被这条语句影响的每一条记录的两个副本。一个副本显示变化前的记录,另一个副本显示变化后的记录。当日志写完之后,DBMS才实际对磁盘中的记录进行修改。

如果用户随后执行COMMIT语句,事务结束也被记录在事务日志中。如果用户执行ROLLBACK语句,DBMS检查日志,找出自事务开始以来被修改的记录“以前”的样子,然后使用这些信息恢复它们以前的状态,有效地撤销事务期间对数据库所做的修改。

如果系统出错,系统操作员通常通过运行DBMS提供的特殊恢复程序来复原数据库。恢复程序检查到事务日志末尾,查找故障之前没有被提交的事务。恢复程序回滚没有完全完成的事务,以便仅有被提交的事务反映到数据库中,而故障中正处理的事务被回滚。

事务日志的使用明显增加了更新数据库的开销。在实际中,主流商用DBMS产品使用的日志技术比上述描述的方案更复杂,用以减小这种开销。此外,事务日志通常被存储在高速磁盘驱动器中,不同于存储数据库的磁盘,以减小磁盘访问竞争。某些个人计算机DBMS产品允许关闭事务日志性能,以提高DBMS的性能。

银行转帐的例子是最经典的事务示例:

用户把钱从一个银行账号转账至另一个银行账号,需要将资金从一个银行账号中取出,然后再存入另一个银行账号中。理想来说,这两次操作都应该成功。但是,如果有错误发生,则两次操作都应该失败,否则的话,操作之后其中一个账号中的金额将会是错误的,整个操作过程应该是原子性的,两个操作都是一个原子事务操作的一部分。

示例:

 

Oracle 事务_w3cschool

扫码下载编程狮APP

恭喜您成为首批注册用户

获得88经验值奖励

事务在数据库中是工作的逻辑单元,单个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制,可以确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。

SQL92标准对数据库事务的特点进行如下定义:

一个事务里面所有包含的SQL语句都是一个整体,是不可分割的,要么不做,要么都做。

事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的。

数据库允许多个并发事务同时对其中的数据进行读写和修改的能力,隔离性可以防止事务在并发执行时,由于他们的操作命令交叉执行而导致的数据不一致状态。

当事务结束后,它对数据库中的影响是永久的,即便系统遇到故障的情况下,数据也不会丢失。

一组SQL语句操作要成为事务,数据库管理系统必须保证这组操作的原子性(Atomicity)、一致性(consistency)、隔离性(Isolation)和持久性(Durability),这就是ACID特性。

以下是解释如何在Oracle 中使用事务的主题列表:

更多建议:

Copyright©2021 

编程狮

违法和不良信息举报电话:173-0602-2364

扫描二维码

下载编程狮App

编程狮公众号

联系方式:

Oracle事务Transaction - 职场亮哥 - 博客园

参考资料:

事务(Transaction)是访问并可能更新数据库中各种

的一个程序执行单元(unit)。事务由事务开始(

)和事务结束(

)之间执行的全体操作组成。

-事务的原子性强调了一个事物是一个逻辑工作单元,是一个整体,是不可分割的。一个事务所包含的操作要么全部做,要不全部不做。

-一个事务执行一项数据库操作,事务使数据库从一种一致性的状态变换成另一种一致性状态。

-在事务未提交前,它操作的数据,对其他用户不可见。

-一旦事务成功完成,该事务对数据库所施加的所有更新都是永久的。

以第一个DML语句的执行作为开始

以下面的其中之一作为结束:

当多个会话同时访问(操作)相同的数据时,将会出现一些意想不到的结果。包括:

脏读 --dirty reads

一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚

不可重复读 --non-repeatable reads

在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。

幻读 --Phantom(虚幻的) reads

事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录。对事物1而言就好像出现了幻觉一样。

Oracle的锁定机制

Oracle尽可能的减少锁定的使用

Oracle的读操作不会对表加锁,一些数据库会使用查询锁定(共享锁,排它锁)

Oracle通过回滚机制,保证读不会受到阻塞

Oracle没有锁管理器

Oracle中锁作为数据块的一种属性存在

Oracle和Sql Server锁的区别

通过在事务中间设置检查点,可以更加精细的控制事务,防止一部分错误操作导致整个事务重新运行。演示如下:

一旦返回到保存点s1之后s2就失去了效果,因为已经回到s1了,这时候s2还不存在。

自治事务允许在一个事务中存在独立的事务,它的操作不会对当前事务产生影响。

语法:

关于自治事务的使用可以参考:

实验演示如下:(演示用例来自参考资料Oracle中的自治事务)

首先是不使用自治事务

从这个例子中,我们看到COMMIT和ROLLBACK的位置无论是在主匿名块中或者在子程序中,都会影响到整个当前事务.

现在如果将procedure local改成自治事务,在procedure local后面加上:

效果如下:

commit Point Strength

Oracle选取Commit Point Strength(相当于权重)最大的数据库作为Commit point。

2PC-two phase commit

为了完成准备阶段,除了commit point机器外,其它的数据库机器按照以下步骤执行:

每个节点检查自己是否被其它节点所引用,如果有,就通知这些节点准备提交(进入prepare阶段)

每个节点检查自己运行的事务,如果发现本地运行的事务不做修改数据操作,则跳过后面的步骤,直接返回一个read only给全局协调进程。

如果事务需要修改数据,为事务分配相应的资源用于保证修改的正常进行。

对事物做的修改,记录redo信息。

本地redo保证事务失败后的回滚。

当上面的工作都成功后,给全局协调进程返回准备就绪的信息,反之,返回失败的信号。

提交阶段按下面的步骤进行:

分布式事务的结束就是全局协调器和commit point两者之间释放资源的顺序。

2PC是否真的可以保证分布式事务的一致性?

关于CAP理论可以参见:

记得帮我点赞哦!

精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,按照目录合理分类,总能找到你需要的学习资料,还在等什么?快去关注下载吧!!!

我是职场亮哥,YY高级软件工程师、四年工作经验,拒绝咸鱼争当龙头的斜杠程序员。

听我说,进步多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个鼓励,将不胜感激。

Oracle 事务 - 元贞 - 博客园

Oracle中的事务_Rushinger-CSDN博客_oracle中事务是什么

事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作。

这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行。

事务是一个不可分割的工作逻辑单元。

例如:银行转账过程就是一个事务。它需要两条update语句来完成,这两条语句是一个整体,如果其中一条出现错误,则整个转账业务也应取消,两个账户中的余额应恢复到原来的数据。

Atomicity原子性:要么都成功,要么都失败。

Consistency一致性 :事务执行前后 ,总量保持一致

Isolation隔离性:各个事务并发执行时,彼此独立

Durability持久性:持久化操作。

(MySQL: 自动提交,自动将每一条DML语句直接commit )

Oracle事务流程图

Oracle:手工提交

事务的开始标识: 第一条DML

事务的中间过程: 各种DML操作

结束:

—i.显示提交:commit

—ii.隐式提交(自动提交):正常退出exit(ctrl+c)、DCL(grant …to…, revoke …from )、DDL(create … ,drop …)

—i.显示回滚:rollback

—ii.隐式回滚:异常退出(宕机、断电)

打游戏: 10 : 1 ,2(savepoint) , 3,4,5 (savepoint) ,6,7,8 -->rollback

当一个事务正在访问数据,并对此数据进行了修改(1->2),但是这种修改【还没有提交到数据库(commit)】; 此时,另一个事务也在访问这个数据 。本质: 某个事务(客户端)读取到的数据是 过时的。

在一个事务内(客户端)内,多次读取同一个数据,但结果不同。

本质:就是事务A拿到了 被其他事务B修改并提交后的数据

在一个事务内(客户端)内,多次读取同一批数据,但结果不同。

a.不可重复读指的是对于“同一条”数据的查询操作 a ->b

幻读对于“多条数据”的查询操作,数据量数: 20条 -> 18条

b.不可重复读:update

幻读:insert|delete

四种隔离级别的程度 依次递进(解决 并发的效果,越来越 稳定) ,但是性能越来越低。

并发性 、可用性 本身就是矛盾的。

Oracle只支持其中两种:Read Committed(默认),Serializable

(oracle自身扩充了一种 read only,实际 read only隶属于 Serializable级别 )

切换四种隔离级别:

set transaction isolation level Serializable;

切换read only:

set transaction read only ;

MySQL 支持全部的四种

扫一扫,分享内容

打赏作者

PX-C

你的鼓励将是我创作的最大动力

您的余额不足,请更换扫码支付或

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

oracle事务 - 普天2022 - 博客园

脏读:两个事物,一个事务修改数据 未提交;另一个事务查询数据

不可重复读:同一个事务,多次读取同数据结果不同(其实是另个一个事务修改了数据) ---对应的是修改

幻象读:同一个事务,多次读取一个范围的数据,读取的记录数不同---对应insert

读未提交 read uncommit:可以读未提交的数据

读提交 read commit:只有读提交过的数据

select * from table where id=1 for update

可重复读 reapeat read

序列化 serializable:

这是数据库最高的隔离级别,事务“串行化顺序执行”,

大多数数据库默认的事务隔离级别是Read committed,比如Sql Server , Oracle。Mysql的默认隔离级别是Repeatable read。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

READ UNCOMMITTED 幻象读、不可重复读和脏读都容许。

READ COMMITTED 容许幻象读、不可重复读,不容许脏读

REPEATABLE READ 容许幻象读,不容许不可重复读和脏读

SERIALIZABLE 幻象读、不可重复读和脏读都不容许

select * from A where id=2 for update skip locked

 

参考资料

基于oracle的sql优化 

Oracle数据库事务详解_深水鱼儿-CSDN博客_oracle数据库事务

什么是事务

事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。

事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是:

1、原子性

一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换

2、一致性

事务的执行使得数据库从一种正确状态转换成另外一种正确状态,一致性与原子性是密切相关的。

3、隔离性

一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

4、持久性

持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

隔离级别

ACID这4个特征中,最难理解的是隔离性。在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。4个隔离级别分别是:读未提及(READ_UNCOMMITTED)、读已提交(READ_COMMITTED)、可重复读(REPEATABLE_READ)、顺序读(SERIALIZABLE)。

注意:

4种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。

一般数据默认级别是读以提交或可重复读。

资料参考:

mysql事物的4种隔离级别:

扫一扫,分享内容

打赏作者

于车之

你的鼓励将是我创作的最大动力

您的余额不足,请更换扫码支付或

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

oracle事务概述_热恋oracle的博客-CSDN博客_oracle 事务

事务的概念都是关系数据库范例的一部分。事务由一个或多个DML语句组成,后面紧跟着ROLLBACK或COMMIT命令。可以在事务内使用SAVEPOINT命令给出控制程度。

扫一扫,分享内容

打赏作者

热恋Oracle

你的鼓励将是我创作的最大动力

您的余额不足,请更换扫码支付或

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。

2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

oracle事务和锁 - wishyouhappy - 博客园

  一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退。

 

  1)事务的提交和回滚:COMMIT/ROLLBACK

  2)事务的开始和结束

    开始事务:连接到数据库,执行DML、DCL、DDL语句

    结束事务: 1. 执行DDL(例如CREATE TABLE),DCL(例如GRANT),系统自动执行COMMIT语句

          2. 执行COMMIT/ROLLBACK

          3. 退出/断开数据库的连接自动执行COMMIT语句

          4. 进程意外终止,事务自动rollback

          5. 事务COMMIT时会生成一个唯一的系统变化号(SCN)保存到事务表

  3)保存点(savepoint): 可以在事务的任何地方设置保存点,以便ROLLBACK

  4)事务的四个特性ACID :

    1. Atomicity(原子性): 事务中sql语句不可分割,要么都做,要么都不做

    2. Consistency(一致性) : 指事务操作前后,数据库中数据是一致的,数据满足业务规则约束(例如账户金额的转出和转入),与原子性对应。

    3. Isolation(隔离性):多个并发事务可以独立运行,而不能相互干扰,一个事务修改数据未提交前,其他事务看不到它所做的更改。

    4. Durability(持久性):事务提交后,数据的修改是永久的。

  5) 死锁:当两个事务相互等待对方释放资源时,就会形成死锁,下面章节详细分析

 

 

  1. 幻想读:

    事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录并commit,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。

  2. 不可重复读取:

    事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录并commit,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。

  3. 脏读:

    事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。

 

oracle支持的隔离级别:(不支持脏读)

sql标准还支持READ UNCOMMITTED (三种都允许)和 REPEATABLE READ(不允许不可重复读和脏读,只允许幻想读)

以上区别在下面章节事务建立,隔离级别分析中说明

 

 

1)建立事务

 

结果:

执行:

结果:

 

 

3) read write

eg:

结果:

 

 

  1.建立两个事务如下:

事务1:

事务2:

 

 2. 在事务1中修改某行数据并commit

 3. 在事务2中查询结果如下:

结果:

  5. 在事务2中查看:

 

 

5) isolation level  serializable

1.建立两个事务如下:

事务1:

事务2:

 

 2. 在事务1中修改某行数据并commit

 3. 在事务2中查询结果如下:

结果:

  4. 在事务1中插入一行数据,并提交

  5. 在事务2中查看:

  1)说明

    锁是一种机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制

   2) oracle中锁的类别

    1.DDL锁: oracle自动的施加和释放

    2.DML锁:事务开始时施加,使用Commit后者Rollback被释放、

    3.内部锁: 由oracle自己管理以保护内部数据库结构

  3)oracle锁的粒度

    1. 行级锁(TX):阻止该行上的DML操作,直到Commit或者Rollback

    2. 表级锁(TM):

    3. 数据库级锁: eg: 将数据库锁定为只读模式 alter database open read only;

           eg: 将数据库设置为限制模式(导入导出数据库时使用):alter system enable restricted session;

 

  1)概括

  说明:

    1. 数字越大,级别越高

  2)eg:

 

1)概括

2)eg:

 

 

  1. 开两个进程(此处使用sqldeveloper模拟)建立两个事务

事务1:

事务2:

 

 

  2. t1 时刻 事务1和事务2中分别执行如下语句

事务1:

事务2:

 结果如下:

 

 

 3. t2时刻事务1和事务2中分别执行如下语句

事务1:

事务2:

结果如下:

 

  4. commit 事务2,事务1结果如下:

 

 

 

1)执行commit或者rollback结束事务

2)终止会话

还是借用3中死锁的例子

在等待资源时执行,查找阻塞会话

执行:

结果:

解决方法:另起一个session,关闭当前session(

另起线程执行上面的语句:

结果如下:(session kill成功,死锁解除,事务1更新成功)