`
lvhuiqing
  • 浏览: 243798 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

JDBC学习(三)事务的隔离级别

 
阅读更多
<div class="tit">事务隔离级别和锁</div>
<div class="date">2009-01-07 09:55</div>
<p>
</p>
<table style="" border="0"><tbody><tr>
<td>
<div id="blog_text" class="cnt">
<p>事务准备接受不一致数据的级别称为隔离级别。隔离级别是一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。应用程序要求的隔离级别确定了所使用的锁定行为:</p>
<p><br>数据库在被广大客户所共享访问的操作过程中很可能出现以下几种不确定情况 :</p>
<p>1. 更新丢失(Lost update):两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开来</p>
<p>2. 脏读取(Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险很可能所有操作都被回滚</p>
<p>3. 不可重复读取(Non-repeatable Reads):一个事务对同一行数据重复读取两次但是却得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交</p>
<p>4. 两次更新问题(Second lost updates problem):无法重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效</p>
<p>5. 虚读(Phantom Reads):也称为幻像(幻影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)这是因为在两次查询过程中有另外一个事务插入数据造成的</p>
<p>为了避免上面出现几种情况在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。</p>
<p>1.未授权读取(Read Uncommitted):也称未提交读。允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现 。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。</p>
<p>2. 授权读取(Read Committed):也称提交读。允许不可重复读取但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行 。SQL Server 默认的级别。在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。</p>
<p>3. 可重复读取(Repeatable Read):禁止不可重复读取和脏读取。但是有时可能出现幻影数据,这可以通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务 。在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。</p>
<p>4. 序列化(Serializable):也称可串行读。提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到 。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。</p>
<p>隔离级需要使用SET 命令来设定其语法如下: <br>SET TRANSACTION ISOLATION LEVEL <br>{READ COMMITTED <br>| READ UNCOMMITTED <br>| REPEATABLE READ <br>| SERIALIZABLE } <br><br><br>下面是四种隔离级别允许不同类型的行为。<br><br>隔离级别 脏读 不可重复读取 幻像(幻影)<br>未提交读 是 是 是<br>提交读 否 是 是<br>可重复读 否 否 是<br>可串行读 否 否 否</p>
<p>隔离级别越高越能保证数据完整性和一致性,但是对并发性能影响也越大。对于多数应用程序,可以优先考虑把数据库系统隔离级别设为Read Committed ,它能够避免脏读取而且具有较好并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制 。</p>
<p>锁(Lock) 是在多用户环境下对资源访问的一种限制。机制当对一个数据源加锁后,此数据源就有了一定的访问限制。我们就称对此数据源进行了“锁定”。在SQL Server中,可以对以下的对象进行锁定: <br><br>数据行(Row):数据页中的单行数据; <br>索引行(Key):索引页中的单行数据,即索引的键值; <br>页(Page):页是SQL Server 存取数据的基本单位,其大小为8KB; <br>盘区(Extent):一个盘区由8 个连续的页组成; <br>表(Table); <br>数据库(Database)。</p>
<p><br>在SQL Server 中,锁有两种分类方法。 <br>(1) 从数据库系统的角度来看 <br>锁分为以下三种类型: <br><br>1.独占锁(Exclusive Lock) <br>独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。执行数据更新命令,即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。但当对象上有其它锁存在时,无法对其加独占锁。独占锁一直到事务结束才能被释放。 <br>2.共享锁(Shared Lock) <br>共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。在SELECT 命令执行时,SQL Server 通常会对对象进行共享锁锁定。通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放。 <br>3.更新锁(Update Lock) <br>更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。 <br><br>2)从程序员的角度看 <br>锁分为以下两种类型: <br><br>1.乐观锁(Optimistic Lock) <br>乐观锁假定在处理数据时,不需要在应用程序的代码中做任何事情就可以直接在记录上加锁、即完全依靠数据库来管理锁的工作。一般情况下,当执行事务处理时SQL Server会自动对事务处理范围内更新到的表做锁定。 <br>2.悲观锁(Pessimistic Lock) <br>悲观锁对数据库系统的自动管理不感冒,需要程序员直接管理数据或对象上的加锁处理,并负责获取、共享和放弃正在使用的数据上的任何锁。</p>
<p>锁定优化程序提示及其描述 <br>优化程序提示 优化程序提示描述 <br>holdlock 保持锁定直到事务结束 <br>nolock 检索数据时不使用锁 <br>paglock 使用页面锁 <br>tablock 使用表锁 <br>tablockx 使用独占表锁 <br>updlock 使用更新锁</p>
<p>如: SELECT * FROM authors (paglock holdlock index=aunmind) <br><br>死锁及其防止:</p>
<p>死锁(Deadlocking) 是在多用户或多进程状况下,为使用同一资源而产生的无法解决的争用状态,通俗地讲,就是两个用户各占用一个资源,两人都想使用对方的资源,但同时又不愿放弃自己的资源,就一直等待对方放弃资源,如果不进行外部干涉,就将一直耗下去。 <br><br>死锁会造成资源的大量浪费,甚至会使系统崩溃。在SQL Server 中解决死锁的原则是“牺牲一个比两个都死强”,即挑出一个进程作为牺牲者,将其事务回滚,并向执行此进程的程序发送编号为1205 的错误信息。而防止死锁的途径就是不能让满足死锁条件的情况发生,为此,用户需要遵循以下原则: <br><br>尽量避免并发地执行涉及到修改数据的语句; <br>要求每个事务一次就将所有要使用的数据全部加锁,否则就不予执行; <br>预先规定一个封锁顺序所有的事务,都必须按这个顺序对数据执行封锁,例如,不同的过程在事务内部对对象的更新执行顺序应尽量保持一致; <br>每个事务的执行时间不可太长,对程序段长的事务可考虑将其分割为几个事务。</p>
</div>
</td>
</tr></tbody></table>
分享到:
评论

相关推荐

    JDBC事务 JTA事务 传播特性 隔离级别

    有关JDBC事务 JTA事务 传播特性 隔离级别等等

    JDBC专题(六)-JDBC专题-事务的隔离级别.docx

    •隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 A ------&gt; B B ------&gt; C •持久性(Durability...

    JDBC总结——事务

    文章目录事务一、事务的基本介绍1、概念2、操作3、操作实例4、MySQL数据库中默认自动提交二、事务的四大特征三、事务的隔离级别1、概念2、存在的问题3、隔离级别四、Jdbc事务控制1、概述2、控制事务的API:3、核心...

    jdbc的详细介绍

    6. 事务的隔离级别 第五章 JDBC2.0 1. ResultSet的可滚动性(默认只能向下(向前)移动) 2. ResultSet的可更新性(默认是不可以更新) 3. 批处理 4. 高级数据类型 第六章 2.0扩展内容 1. 连接池 2. 数据源(工厂模式...

    Spring声明式事务配置管理方法

    可以在spring中对整个项目的事务进行控制

    Java数据库接口JDBC介绍

    2.1.6 事务隔离级别 5 2.2 DriverManager类 6 2.2.1 跟踪可用驱动程序 6 2.2.2 建立连接 7 2.3 Statement对象 7 2.3.1 创建Statement对象 8 2.3.2 使用Statement对象执行语句 8 2.3.3 语句完成 8 2.3.4 语句完成...

    19-事务-源代码.rar

    二、JDBC事务操作 三、DBUtils事务操作 四、使用ThreadLocal绑定连接资源 五、事务的特性和隔离级别(概念性问题---面试)。 1.什么是事务 2.mysql的事务 1.QueryRunner 1.事务的特性ACID 2.并发访问问题----由...

    JDBC Java Database Connectivity

    基本目标:  了解JDBC (Java Database Connectivity)相关概念  JDBC的四种类型的驱动  JDBC核心接口与类  JDBC体系结构图和开发步骤 JDBC 事务 进阶目标: ... 事务的隔离级别 批处理(Batch)

    Java_JDBC由浅入深

    8.6 数据库的隔离级别介绍 56 8.6.1 未提交读 57 8.6.2 提交读 58 8.6.3 重复读 59 8.6.4 序列化读 60 8.7 小结 62 第九节 PreparedStatement接口的使用 62 第十节 CallableStatement接口的使用 62 9.1 无参无返回值...

    MyBatis 事务管理解析:颠覆你⼼中对事务的理解.pdf

    1.说到数据库事务,⼈们脑海⾥⾃然不⾃然的就会浮现出事务的四⼤特性、四⼤隔离级别、七⼤传播特性。 四⼤还好说,问题是七⼤传播特性是哪⼉来的?是Spring在当前线程内,处理多个数据库操作⽅法事务时所做的⼀种...

    JDBC核心技术精讲

    本课程《JDBC核心技术精讲》为...13、事务概述及事务的四大特性 14、mysql中使用事务 15、jdbc中使用事务 16、数据库连接池的介绍和使用(DBCP/C3P0/Druid)17、DBUtils工具的使用18、详细讲述结果集处理器的使用

    尚硅谷_佟刚_JDBC.pptx

    11. 处理事务 & 事务的隔离级别(视频16-17) 12. 批量处理(视频18) 13. 数据库连接池 & C3P0 & DBCP(视频19-20) 14. 使用 DBUtils(视频21-23) 15. 使用 JDBC 调用函数 & 存储过程(视频24) 16. 课件及源码 ----------...

    事务讲解-LingRan.pptx

    主要内容涉及java事务的基础,事务的四大特性,数据库中的事务,并发访问出现的问题和隔离级别设置,JDBC中的实现以及事务相关面试问题的整理汇总。

    Hasor开发框架 v3.2.2

    程序打包之后一套配置通吃(日常、预发、线上)以及其它各种环境6、完备的JDBC操作接口,支持Result -&gt; Object映射7、提供三种途径控制事务,支持七种事务传播属性,标准的事务隔离级别8、支持多数据源、及多数据源下...

    weblogic平台J2EE调优策略

    2.6.2 优化事务隔离级别和事务属性 2.6.3 其他一些小技巧 第三章 数据库调优 3.1.1 Oracle性能优化 3.1.2 Oracle的其他调整 第四章 操作系统调优 4.1 操作系统调整 4.1.1 HP-UX 4.1.2 Solaris 4.1.3 AIX 4.1.4 Linux...

    Java开发工程师面试题资料

    有哪些隔离级别? 4. 数据类型 char 与 varchar2 有什么区别?性能方面各有什么优势? 5. 你怎么知道查询 SQL 的性能高还是低? 6. 在开发过程中遇到过数据库锁吗?怎样解锁? 7. 怎样处理并发数据? (重点) 8. ...

    spring考试通过必备材料.docx

    事务的隔离级别设置为DEFALIT 26 在applicationContext.xml中配置文件通知 27 JDBC 28 Text测试类 29 Hibernate.cfg.xml 31 AOP方法的通知 31 单独前置通知 31 单独后置通知 32 单独环绕通知 32

    Java数据编程指南

    Java数据库连接(JDBC) 什么是JDBC JDBC结构 开始起步 使用...JDBC事务隔离级别 保存点 使用光标 PreparedStatement接口 批更新 CallableStatement JDBC Escape语法 JDBC支持类 ...

    Spring.html

    default:使用数据库默认的隔离级别(mysql:可重复读,oracle:读已提交) readuncommited:读未提交,不可以解决任何问题 readcommited:读已提交,可以解决脏读问题 repeatableRead:可重复读,可以解决脏读,不可重复...

    spring.doc

    5.1.8.3Spring事务的隔离级别 117 拓展: 118 5.1.8.4以XML配置的 形式 119 拓展: 120 5.1.8.5以注解方式配置 125 拓展: 127 5.1.9使用CGLIB以XML形式配置事务 130 5.2 Spring+Hibernate 131 5.2.1 ...

Global site tag (gtag.js) - Google Analytics