Oracle事务管理中经常出现的问题破解
创始人
2024-06-28 18:30:47
0

以下的文章主要是对Oracle事务管理的相关问题的研讨,由于其中包括Oracle是如何对相关的sql语句进行执行,Oracle事务管理的并发与恢复控制的?以下就是正文的主要内容的介绍,希望你会有所收获。

1.Oracle对一条sql语句的执行是怎么Oracle事务管理并发和恢复控制的?

一条符合语法的sql语句,定义了对数据库的操作。此操作执行的时刻,对应了数据库的一个数据状态。可以这样理解这个状态:到此执行时刻为止,没有任何数据库语句级操作正在并发执行;就是说实际上正在并发执行的多个语句级操作可以假定在此语句操作之后执行。

这里强调语句级操作,是指如果一个事务包含多个操作语句,在此时刻实际已经执行了其中几个,此时刻也正在执行某一个语句,那么不能简单地认为前面几个执行的操作语句也还没发生,这是要看事务的隔离级别的,但是不管事务隔离级别是几级,语句级别上可以认为是序列执行的。

该sql语句的操作过程中认为此数据状态是保持不变的。当此操作执行结束时刻,才产生语句级数据状态影响。

就是说,可能该语句同时更新了两行,但都用了同一个主键,则此时会导致违反唯一性约定而消除整个语句的影响,如果成功执行,但未必就在事务级别上影响数据状态,就是说如果所在事务回滚,此影响仍然被消除,不过正如前面所说,一个语句成功执行后,就可能影响其他语句所面对的数据状态。

2.PL/SQL的执行是怎么管理并发和恢复控制的?

PL/SQL是在一个PL/SQL引擎中执行的。该引擎可以认为是Oracle之外的单位。该引擎会解析PL/SQL,并不断发送SQL语句给Oracle。所以和用JAVA程序通过JDBC在一个会话连接中发送多个SQL语句没有本质差别。也因此并发和恢复Oracle事务管理没有不同。

3.Oracle死锁是怎么样产生的?

Oracle控制并发是使用的锁机制,也因此即会产生死锁问题。Oracle在执行一个语句时,会根据语句的含义,同时根据所处的事务隔离级别,解析出需要加什么样的锁,什么时候释放。而隔离级别越高,对锁资源占用越大。

现在考虑这样的情形,Oracle同时处理两个事务A,B。A发过来几条语句,导致Oracle加了几把锁没有释放,B发过来几条语句,导致Oracle加了另外几把锁没有释放,现在,A又发过来一个语句,此语句要求Oracle加的一些锁中,有几个锁已经被B事务占用,那么A等待,而B又发过来一条语句,此语句要求Oracle加的锁,在A手中。

于是死锁出现。而隔离级别越高,死锁的可能性越大。可以分析出来,死锁的根本原因在于,事务包含的语句是分条发给Oracle的,Oracle不能够在事务开始时刻就解析出全部执行过程需要什么锁,什么时候释放,无法统一安排。

死锁问题归咎由谁呢?我这么理解:如果没有事务概念,Oracle在语句级上控制并发,完全不会出现死锁问题。因为在解析语句时,Oracle已经知道要加多少把锁,它会看目前这些锁如果能全部获得就执行,否则就等待。

可是实际应用怎么能没有事务的概念呢?我同意完全可以出现新的sql语法,可以把原来的多条sql语句的含义在一个语句中定义完毕,长短不是问题,牺牲一定的语法简洁度也不是问题;然而最关键的是往往我们是在一个业务处理逻辑中,多个数据库操作之间掺杂了其他非数据库操作,而又想获取这些数据库操作作为一个整体的ACID。

因此事务概念必须存在。既然如此,或许我们真得可以把一个事务可能包含的语句在事务开始时就交给Oracle,尽管这样一来,有可能就包含了实际通过业务逻辑判断不会执行的语句,导致Oracle浪费锁,降低并发处理能力。

我之前的文章曾经介绍过用JAVA实现同步控制,降低Oracle隔离级别,只利用Oracle的原子性支持。这样做的原因就在上文中基本提到了。我们在编写JAVA业务逻辑时,是知道我们需要在一串业务逻辑中操作多少次数据库的,也因此,能够在业务逻辑开始时就控制得到所有的锁再执行。

这样做确实能够降低Oracle压力,并消除死锁问题,然而这样做会导致同步压力集中到JAVA应用端,而且对研发人员要求也会提高。尽管如此,在JAVA应用端使用同步要灵活很多,而不必限制在表锁行锁,你甚至可以建一个森林结构的信号量数据来控制同步。

呵呵,反过来也可以理解Oracle事务管理隔离级别的问题,为什么要存在允许幻像读的隔离级别呢?隔离级别的存在是一种权衡,如果应用既不想自己控制并发,又想提高并发能力,则需要好好权衡一下吧!

文章出自: http://www.programbbs.com/doc/3298.htm

【编辑推荐】

  1. 对Oracle 性能工具的关注
  2. LTO归档解决方案容量、性能和功能介绍
  3. Oracle数据库的“狂大”的缘由
  4. Oracle密码忘记的解决方法
  5. Oracle EM管理 MySQL的实操方案

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...