



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/?p=476/William/archive/2006/06/30/56053.htmlJDBC事务隔离级别和db2中几个隔离级别行锁等聊记下对应的事务处理问题 工作中头疼的事务拆分,降低事务的文字简介JDBC的数据隔离级别设置:JDBC 数据库隔离级别 数据访问情况TRANSACTION_READ_UNCOMMITTED ur 就是俗称“脏读”(dirty read),在没有提交数据时能够读到已经更新的数据TRANSACTION_READ_COMMITTED cs 在一个事务中进行查询时,允许读取提交前的数据,数据提交后,当前查询就可以读取到数据。update数据时候并不锁住表TRANSACTION_REPEATABLE_READ rs 在一个事务中进行查询时,不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据TRANSACTION_SERIALIZABLE rr 在一个事务中进行查询时,不允许任何对这个查询表的数据修改。JDBC事务隔离级别为了解决与“多个线程请求相同数据”相关的问题,事务之间用锁相互隔开。多数主流的数据库支持不同类型的锁;因此,JDBC API 支持不同类型的事务,它们由 Connection 对象指派或确定。在 JDBC API 中可以获得下列事务级别:TRANSACTION_NONE 说明不支持事务。TRANSACTION_READ_UNCOMMITTED 说明在提交前一个事务可以看到另一个事务的变化。这样脏读、不可重复的读和虚读都是允许的。TRANSACTION_READ_COMMITTED 说明读取未提交的数据是不允许的。这个级别仍然允许不可重复的读和虚读产生。TRANSACTION_REPEATABLE_READ 说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。TRANSACTION_SERIALIZABLE 是最高的事务级别,它防止脏读、不可重复的读和虚读。 为了在性能与一致性之间寻求平衡才出现了上面的几种级别。事务保护的级别越高,性能损失就越大。假定您的数据库和 JDBC 驱动程序支持这个特性,则给定一个 Connection 对象,您可以明确地设置想要的事务级别:1 conn.setTransactionLevel(TRANSACTION_SERIALIZABLE) ;可以通过下面的方法确定当前事务的级别:1234567891011int level = conn.getTransactionIsolation(); if(level = Connection.TRANSACTION_NONE) System.out.println(TRANSACTION_NONE); else if(level = Connection.TRANSACTION_READ_UNCOMMITTED) System.out.println(TRANSACTION_READ_UNCOMMITTED); else if(level = Connection.TRANSACTION_READ_COMMITTED) System.out.println(TRANSACTION_READ_COMMITTED); else if(level = Connection.TRANSACTION_REPEATABLE_READ) System.out.println(TRANSACTION_REPEATABLE_READ); else if(level = Connection.TRANSACTION_SERIALIZABLE) System.out.println(TRANSACTION_SERIALIZABLE);DB2中隔离级别和锁的各种用法和机制基于db2 9 中做了以下的试验123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051CREATE TABLE RRTest (pkID VARCHAR(20) NOT NULL ,unID1 VARCHAR(20) NOT NULL,UnID2 VARCHAR(20) ,CUSTOMER_ID VARCHAR(6) , ORDER_TYPE DECIMAL(2,0) , EXECUTION_TYPE DECIMAL(2,0) , ORDER_DATE VARCHAR(8) , ORDER_TIME VARCHAR(6) , ORDER_DATETIME TIMESTAMP , SIDE DECIMAL(1,0) , TRADE_TYPE DECIMAL(1,0) , ORDER_AMOUNT DECIMAL(15,2) , ORDER_PRICE DECIMAL(8,4), TSID VARCHAR(20) ) INSERT INTO RRTest SELECT Order_ID, Order_ID, Order_ID, CUSTOMER_ID, ORDER_TYPE, EXECUTION_TYPE, ORDER_DATE, ORDER_TIME, ORDER_DATETIME, SIDE, TRADE_TYPE, ORDER_AMOUNT, ORDER_PRICE ,ORDER_ID FROM DB2INST1.Fx_Order WHERE ORDER_DATE 20070401GOSELECT COUNT(*) FROM RRTEST72239 ALTER TABLE DB2INST1.RRTest ADD PRIMARY KEY (pkID); CREATE UNIQUE INDEX UNIQINDX ON RRTest(unID1)CREATE INDEX INDX002 ON RRTest(unID2)db2 RUNSTATS ON TABLE DB2INST1.RRTest ON ALL COLUMNS AND INDEXES ALL ALLOW WRITE ACCESS db2 CONNECT TO db2TTdb2 +c SELECT * FROM RRTEST WHERE TSID=20070223ORD01267732 FOR UPDATE WITH RRSELECT * FROM RRTEST WHERE TSID=20070222ORD01266302 FOR UPDATE WITH RR SELECT * FROM RRTEST WHERE TSID=20070223ORD01267732 FOR UPDATE WITH RSSELECT * FROM RRTEST WHERE TSID=20070222ORD01266302 FOR UPDATE WITH RS SELECT * FROM RRTEST WHERE unID1=20070223ORD01267732 FOR UPDATE WITH RRSELECT * FROM RRTEST WHERE unID1=20070222ORD01266302 FOR UPDATE WITH RRSELECT * FROM RRTEST WHERE unID1=20070223ORD01267732 FOR UPDATE WITH RSSELECT * FROM RRTEST WHERE unID1=20070222ORD01266302 FOR UPDATE WITH RS SELECT * FROM RRTEST WHERE unID2=20070223ORD01267732 FOR UPDATE WITH RRSELECT * FROM RRTEST WHERE unID2=20070222ORD01266302 FOR UPDATE WITH RRSELECT * FROM RRTEST WHERE unID2=20070223ORD01267732 FOR UPDATE WITH RSSELECT * FROM RRTEST WHERE unID2=20070222ORD01266302 FOR UPDATE WITH RS SELECT * FROM RRTEST WHERE pkID=20070223ORD01267732 FOR UPDATE WITH RRSELECT * FROM RRTEST WHERE pkID=20070222ORD01266302 FOR UPDATE WITH RRSELECT * FROM RRTEST WHERE pkID=20070223ORD01267732 FOR UPDATE WITH RSSELECT * FROM RRTEST WHERE pkID=20070222ORD01266302 FOR UPDATE WITH RS按照以上字段pkID 是主键,unID1 是唯一健索引,unID2 是普通健索引,TSID 是普通字段,没有在上建立索引。试验结论:PK_INDEX UNIQ_INDEX NormalINDEX NO_INDEXWITH RR锁行,不锁表锁行,不锁表不锁行,不锁表(1)锁行,锁表WITH RS锁行,不锁表锁行,不锁表锁行,不锁表锁行,锁表(2)锁行是指在一个事务中用某种方式读取并更改了改行数据并显示得指明要修改后,这个事务将锁住改行,直到它提交或者回滚了事务后,才释放该锁。锁表是指在用以上各种SQL在读取并更改一行的同时锁住了整个表。对以上红字部分(1)可能有不能理解的是:为什么对普通索引和主键或者唯一健索引的不同结论?对PK和UNIQ的解释是因为RR 是可重复的读的级别,对这次检索扫描到的有可能成为自己的潜在检索对象的内容都会锁住,而因为是主键或者唯一健,别的行不可能成为这次这个检索的潜在读的范围,就是对别的数据此事务根本就没有必要锁,任何情况的更改都不可能出现幻读的情况(此表上的约束限制),所以只锁这一行。这么理解对PK,UNIQ没有问题。但是NormalINDEX我认为应该是锁住这个表而不是不锁。这点一直没想明白。留待以后再加强理解。对隔离级别是“锁定检索到的数据行”,是通过SQL检索到的结果进行锁定, PK,UNIQ,INDEX的结论完全都可以理解。对 tableScan的检索而出现的锁表有些象RR隔离级别的所为。遇到此类并发控制程序中注意一下,select * From TTT where *= ? for update with RR(RS),这里的* 可不是随便定义的。隔离级别分为RR/RS/CS/UR这四个级别。 下面让我们来逐一论述:1 RR隔离级别: 在此隔离级别下, DB2会锁住所有相关的纪录。 在一个SQL语句执行期间, 所有执行此语句扫描过的纪录都会被加上相应的锁。 具体的锁的类型还是由操作的类型来决定, 如果是读取,则加共享锁; 如果是更新, 则加独占锁。 由于会锁定所有为获得SQL语句的结果而扫描的纪录, 所以锁的数量可能会很庞大, 这个时候, 索引的增加可能会对SQL语句的执行有很大的影响,因为索引会影响SQ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广西百色市西林县供销合作社联合社招聘编外聘用人员1人考前自测高频考点模拟试题及参考答案详解
- 衡水市人民医院年度国家财经医改政策应知应会考试
- 大学课件审核机制
- 2025人民医院无创DNA产前检测技术临床应用考核
- 北京市中医院宫腔镜取胚术操作资格认证
- 邢台市人民医院个人防护用品穿脱流程实操考核评分表
- 邯郸市人民医院术前评估完整性考核
- 大学网格员专业知识培训课件
- 秦皇岛市中医院中药离子导入技术考核
- 北京市中医院脊柱导航技术应用考核
- 拆除废旧电缆桥架施工方案
- 人教版九年级道德与法治 上册 第三单元《文明与家园》大单元整体教学设计
- 热力有限公司客户服务手册
- 酒店营销与数字化实务完整全套教学课件
- 二年级应用题大全800题二年级上册数学乘法应用题
- YY/T 1851-2022用于增材制造的医用纯钽粉末
- GB/T 5163-2006烧结金属材料(不包括硬质合金)可渗性烧结金属材料密度、含油率和开孔率的测定
- GB/T 19575-2004农产品批发市场管理技术规范
- 《管理沟通实务(第四版)》课件第一章 沟通与管理沟通
- 监理事故案例分析课件
- 【实验报告】教科版小学科学六年级下册实验报告
评论
0/150
提交评论