<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[随心所欲]]></title>
<link>http://www.stblog.net/</link>
<description><![CDATA[喝可乐，拍照片，写文字，玩数据库]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[sonic.tang@hotmail.com(Sonic)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>随心所欲</title>
	<url>http://www.stblog.net/images/logos.gif</url>
	<link>http://www.stblog.net/</link>
	<description>随心所欲</description>
</image>

			<item>
			<link>http://www.stblog.net/article/photo/jinjilake_1.htm</link>
			<title><![CDATA[金鸡湖]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[随便拍拍]]></category>
			<pubDate>Mon,26 Jul 2010 22:07:42 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=474</guid>
		<description><![CDATA[我也就那些套路了，每年台风来的时候跑到金鸡湖边上咔嚓几张，直到老去。。。<br/><br/><img src="http://www.stblog.net/download.asp?id=99" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=100" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=101" border="0" alt=""/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.stblog.net/article/tech/install_sqlserver2008.htm</link>
			<title><![CDATA[轻松安装SQL SERVER 2005 &amp; 2008 &amp; 2008R2]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[技术学习]]></category>
			<pubDate>Tue,20 Jul 2010 16:07:57 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=472</guid>
		<description><![CDATA[分享一个快捷的链接，指导您进行SQL SERVER的安装，包括SQL SERVER 2008以及2008 R2，今天又新增了SQL SERVER 2005以及SQL SERVER EXPRESS的LINK，FYI<br/><br/><a href="http://technet.microsoft.com/en-us/sqlserver/ff625277.aspx" target="_blank" rel="external">http://technet.microsoft.com/en-us/sqlserver/ff625277.aspx</a>]]></description>
		</item>
		
			<item>
			<link>http://www.stblog.net/article/photo/qingdao.htm</link>
			<title><![CDATA[又见青岛]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[随便拍拍]]></category>
			<pubDate>Tue,13 Jul 2010 21:39:18 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=471</guid>
		<description><![CDATA[参加公司在青岛举办的 Kick Off Meeting，白天看海，晚上吃海鲜，然后十几个人窝在酒店的豪华套房里看世界杯，直至伪球迷们一个个睡着。。。深刻意识到这次找对了组织，这是一个技术一流的团队，也是一个充满欢笑的团队，年龄相仿，兴趣相近，激情四射！<br/><br/><img src="http://www.stblog.net/download.asp?id=94" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=95" border="0" alt=""/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.stblog.net/article/write/microsoft.htm</link>
			<title><![CDATA[我不是张江男了]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[心情随笔]]></category>
			<pubDate>Wed,07 Jul 2010 20:31:33 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=470</guid>
		<description><![CDATA[陆续有朋友获知我离开HP的消息，大多比较惊讶，也对此话题比较感兴趣，所以我就简述一二吧。04年工作至今，从java开发，到CMMI，从SAP BASIS到Oracle DBA，顺带Solaris，Linux，几乎很少接触微软的产品，HR打电话给我，然后抱着试试看的态度经过九轮艰苦的面试之后，最终进了微软。从一个Oracle DBA转变成一个SQL Server Support Engineer，虽说都是数据库，但区别还是不小，所以一切从头开始，新的工作，新的环境，新的技术，新的同事跟老板。。。<br/><br/>HP在张江，MS在闵行，从一个郊区换到另一个郊区，而且郊的更彻底，两家公司各有特色，HP特别是我所在的部门，因为做的是国外的项目，时差问题，所以可以自由支配时间，随便几点上班，随便几点下班，也可以随时在家办公，原则就是把项目最好，部门内部都是些年轻人，很好相处，一起打球，一起玩三国杀，一起喝酒。。。离开HP最舍不得就是那些刚认识的朋友们。。。MS大楼是新盖好的，环境很好，班车路线覆盖整个上海，咖啡牛奶饮料水果点心无限量免费供应，有桌球室，健身房，篮球场，X-BOX，按摩椅等设施，办公电脑都是顶级配置，在职员工的稳定度比较高，同事之间还不大熟悉，所以暂时还没怎么多沟通，感觉都是很好相处的人，希望能够尽快打成一片吧。<br/><br/>从张江搬来闵行，一个人来到一个陌生的环境，独来独往，孤单啊。。。]]></description>
		</item>
		
			<item>
			<link>http://www.stblog.net/article/photo/gulangyu.htm</link>
			<title><![CDATA[鼓浪屿]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[随便拍拍]]></category>
			<pubDate>Fri,25 Jun 2010 15:17:43 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=469</guid>
		<description><![CDATA[工会年度旅游推出了四个地方，井冈山，厦门，柬埔寨，日本，各种原因综合，最终选择了厦门，周一去周三回，这次除了带上D200+1755之外，还跟汪伟借了台GF1，体验一下这种小机器的成像跟画质。<br/><br/>第一天就在鼓浪屿的轮渡附近转了转，天气不好也没怎么拍照，坐在海边的椅子上独自发呆，晚上吃了点海鲜就洗洗睡了。<br/><br/>第二天买了套票，先去风琴博物馆，鼓浪屿里面的颇有情调的小路被闷热的天气搞的了无味道，然后去了百鸟园，上到厦门最高点月光岩，可惜天气很差，然后去了菽庄花园，海滩边无聊的抽着烟的时候，突然人品爆发，乌云被吹走，片刻过后蓝天白云，于是顺着环岛路走了四分之一圈，冒着酷热，拍了不少片子，吃了沙茶面之后重新登上月光岩，终于能够拍个全景了。。。还有最后一站皓月园，天色已晚，也没有体力了，回到酒店，洗澡，看球，睡觉。<br/><br/>第三天直奔厦门大学，从侧门进去的，没有被保安拦下，一进门就倾盆大雨，找了个屋檐，为了保护相机，最终还是浑身湿透，阵雨，雨过天晴，不可否认，厦大确实是目前我见过的最美丽的大学了，出了后门就是大海，隐约可以看到台湾金门，沙滩上很多学生穿着学士服合影留念，我租了辆自行车沿着大海骑行1/4圈后，最终实在由于天气太热放弃。。。<br/><br/>在厦门机场候机的时候，居然还看到了凤姐。。。<br/><br/>飞机晚点了半个小时，起飞的时候，看着夜色中的厦门逐渐消失在视野中，一股不舍油然而升，很少会有这样的感觉，不知为何。。。<br/><br/><img src="http://www.stblog.net/download.asp?id=91" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=84" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=85" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=86" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=87" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=88" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=89" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=90" border="0" alt=""/>]]></description>
		</item>
		
			<item>
			<link>http://www.stblog.net/article/write/montain_dream.htm</link>
			<title><![CDATA[感慨于登山运动]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[心情随笔]]></category>
			<pubDate>Wed,26 May 2010 23:16:24 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=468</guid>
		<description><![CDATA[前一阵子的道拉吉里峰山难，让我这个伪户外爱好者花了不少时间对于登山运动做了一个了解，第一次深刻的感慨于梦想的惊人牵引力，我花了一个周末的时候通读了8264上面的两个帖子，一是马甲KingStone的批判此次道拉吉里峰领队杨春风的帖子，所谓一石激起万层浪，各人对于雪山的热爱，对于征服14座8000米高山的欲望，甚至于在梦想与家庭，与生命的选择上都有着不同的诠释，继而通读了青衣佐刀的《我的09珠峰攀登，活着真好》，虽然有些矫情，但确实让我这个外行人足够震撼。我从来没有想象过，为了一个登顶的梦想，可以花费数年甚至数几十年的准备，可以在上有老下有小，在明知道有生命危险的情况下，依旧砸下几十万甚至上百万的人民币，把生命交托给一个所谓的高山探险公司，所谓的一个领队，所谓的几个夏尔巴人，然后迈向山顶。曾经认为，脑子坏了吧？现在我可以朦胧的感觉，或许这就是梦想，当挣扎在生死边缘想起家人，朋友的时候，当跨上山顶，所谓的空气稀薄地带俯视大地的时候，当看到前辈们的尸体出现在路绳边的时候，当用半辈子时间征服完那14座高山的时候，那是一种什么样的感受？或许是一种灵魂的洗礼，对于人性的全新的认知，我只能够通过看帖子看照片来揣摩，正如山友所述，没有登过山的人永远无法体会面朝大山的感觉。可惜我这辈子都与登山无缘。<br/><br/>感慨颇多，却无以用文字阐述，无论如何，愿此次最终留在大山上没能下来的韩昕、李斌、赵亮能够安息，也希望那些疯狂追逐14座8K梦想的山友们在出发前，能够深深的看看你的父母妻儿的眼神，如果有泪光，那么请扔下行囊，让梦想深埋起来吧！<br/><br/><img src="http://www.stblog.net/download.asp?id=83" border="0" alt=""/>]]></description>
		</item>
		
			<item>
			<link>http://www.stblog.net/article/tech/oracle_ddl_lock.htm</link>
			<title><![CDATA[Oracle数据一致性之锁机制（三）]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[技术学习]]></category>
			<pubDate>Wed,26 May 2010 22:20:49 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=467</guid>
		<description><![CDATA[数据字典锁（data dictionary lock，DDL）的作用是在执行 DDL 操作时对被修改的方案对象或其引用对象的定义进行保护。DDL 锁可以分为三类：排他 DDL 锁（exclusive DDL lock），共享 DDL 锁（share DDL lock），及可解除的解析锁（breakable parse lock）。<br/><br/>当执行以下语句：AUDIT，NOAUDIT，COMMENT，Cr&#101;ate [OR REPLACE] VIEW/ PROCEDURE/PACKAGE/PACKAGE BODY/FUNCTION/ TRIGGER，Cr&#101;ate SYNONYM，及 Cr&#101;ate TABLE（没有使用 CLUSTER 参数时）时，会产生共享 DDL 锁（share DDL lock），而其他的DDL语句产生的都是排他 DDL 锁（exclusive DDL lock），而解析锁是在 SQL 语句执行的解析阶段（parse phase）获得的，当其他DDL操作造成与此锁产生冲突时候，此锁会被解除，所以称之为可解除的解析锁（breakable parse lock）。<br/><br/>对簇（cluster）执行的 DDL 操作需要获取簇及簇内所有表及物化视图上的排他 DDL 锁（exclusive DDL lock）。对簇内表及物化视图的 DDL 操作需要获取簇上的共享 DDL 锁（share DDL lock），以及表或物化视图上的共享 DDL 锁或排他 DDL 锁。簇上的共享 DDL 锁能够防止操作期间其他 DDL 操作将簇移除。<br/><br/>这些比较难以通过实验来查看，所以了解下概念即可。<br/><br/>闩锁（latche）及内部锁（internal lock）的作用是保护数据库及其内存结构。闩锁（latche）是一种简单的底层串行化机制，用于保护 SGA 内的共享数据结构。内部锁（internal lock）更高层且复杂，分为三类，<br/><br/>数据字典缓存锁（dictionary cache lock）：当用户更新或使用时数据字典缓存内的条目（entry）时获取，作用是确保正在被解析的语句不会看到不一致的对象定义。语句解析结束时释放。<br/>文件及重做日志管理锁：用于保护各种文件，例如，保护控制文件（control file）的锁，确保同一时间只有一个进程能够对其进行修改。还有协调重做日志文件（redo log file）使用与归档的锁。以及数据文件（datafile）锁，实现多实例在共享模式下挂载数据库，或一个实例在排他模式下挂载数据库。<br/>表空间及回滚段锁：用于保护表空间及回滚段（rollback segment）。例如，一个表空间处于联机（online）还是脱机（offline）状态对访问同一数据库的所有实例应该是一致的。回滚段上的锁保证 同一时间只有一个实例能够对其执行写操作。<br/><br/>在管理锁时，Oracle 提供了一个 DBMS_LOCK 的 Package，详细可参考：<a href="http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_lock.htm" target="_blank" rel="external">http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_lock.htm</a>#CHDICHDC#CHDICHDC]]></description>
		</item>
		
			<item>
			<link>http://www.stblog.net/article/tech/oracle_tm_lock.htm</link>
			<title><![CDATA[Oracle数据一致性之锁机制（二）]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[技术学习]]></category>
			<pubDate>Mon,24 May 2010 14:53:46 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=466</guid>
		<description><![CDATA[表级锁（TM）具有以下几种模式：行共享（row share，RS），行排他（row exclusive，RX），共享（share，S），共享行排他（share row exclusive，SRX），及排他（exclusive，X）。<br/><br/>表级锁之前的关联可参考下图:<br/><br/><img src="http://www.stblog.net/download.asp?id=81" border="0" alt=""/><br/><br/><img src="http://www.stblog.net/download.asp?id=82" border="0" alt=""/><br/><br/>我们可以通过 v$lock, dba_objects 来得知产生锁的 object 是哪个，产生了什么类型的锁，举例如下<br/> <br/><div class="UBBPanel codePanel"><div class="UBBTitle"><a onClick="copycode(code54837);" style="float:right;cursor: pointer;font-weight: normal; font-style: normal">复制内容到剪贴板</a><img src="http://www.stblog.net/images/code.gif" style="margin:0px 2px -3px 0px;" alt="程序代码"/> 程序代码</div><div class="UBBContent" id=code54837><br/>SQL&gt; up&#100;ate SONIC_TEST set VALUE=&#39;CCCC&#39; wh&#101;re ID=1;<br/> <br/>1 row up&#100;ated<br/> <br/>SQL&gt; sel&#101;ct l.TYPE,<br/>&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decode(l.lmode,<br/>&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&#39;None&#39;,<br/>&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&#39;Null&#39;,<br/>&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2,&#39;Row-S&#39;,<br/>&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3,&#39;Row-X&#39;,<br/>&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4,&#39;Share&#39;,<br/>&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5,&#39;S/Row-X&#39;,<br/>&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6,&#39;Exclusive&#39;,<br/> 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;Unknown&#39;) LockMode,<br/> 11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decode(l.request,<br/> 12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&#39;None&#39;,<br/> 13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,&#39;Null&#39;,<br/> 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2,&#39;Row-S&#39;,<br/> 15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3,&#39;Row-X&#39;,<br/> 16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4,&#39;Share&#39;,<br/> 17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5,&#39;S/Row-X&#39;,<br/> 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6,&#39;Exclusive&#39;,<br/> 19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;Unknown&#39;) RequestMode,<br/> 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.OWNER,<br/> 21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.OBJECT_NAME,<br/> 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o.OBJECT_TYPE<br/> 23&nbsp;&nbsp;&nbsp;&nbsp;from v$lock l, dba_objects o<br/> 24&nbsp;&nbsp; wh&#101;re l.ID1 = o.OBJECT_ID<br/> 25&nbsp;&nbsp;&nbsp;&nbsp; and l.SID = 42;<br/> <br/>TYPE LOCKMODE&nbsp;&nbsp;REQUESTMODE OWNER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OBJECT_NAME&nbsp;&nbsp;&nbsp;&nbsp; OBJECT_TYPE <br/>---- --------- ----------- ---------- --------------- ------------<br/>TM&nbsp;&nbsp; Row-X&nbsp;&nbsp;&nbsp;&nbsp; None&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSTEM&nbsp;&nbsp;&nbsp;&nbsp; SONIC_TEST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TABLE<br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.stblog.net/article/tech/oracle_tx_tm_lock.htm</link>
			<title><![CDATA[Oracle数据一致性之锁机制（一）]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[技术学习]]></category>
			<pubDate>Thu,20 May 2010 15:44:16 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=465</guid>
		<description><![CDATA[先来了解一下锁的概念，锁是保证数据一致性的一种机制，其实现过程由oracle自动完成，多用户模式下，锁有两种模式：<br/><br/>排他锁（exclusive lock）模式：能够阻止共享被加锁的资源。对数据进行修改时必须获得此种模式的锁。第一个排他地对资源加锁的事物是唯一可以对此资源进行修改的事物，直至排他锁被释放。 <br/>共享锁（share lock）模式：依据操作类型有条件地允许共享被加锁的资源。对数据进行读取的多个用户可共享此数据，这些用户可以对资源加以共享锁，防止其他用户并发地修改此资源（对数据进行修改的用户需要排他锁）。多个事务可以对相同的资源加共享锁。 <br/><br/>锁有三种类型：<br/><br/>DML锁（数据锁）：DML锁的作用是保护数据。例如，表级锁（table lock）对整个表加锁，行级锁（row lock）则对选定的数据行加锁。<br/>DDL锁（数据字典锁）：DDL锁的作用是保护方案对象的结构。例如，表及视图的定义。<br/>内部锁（internal lock）及闩锁（latch）：内部锁及闩锁用于保护数据库的内部结构，例如，数据文件。内部锁及闩锁的管理完全由 o&#114;acle 自动完成。<br/><br/>继续细化，DML锁分为：<br/><br/>行级锁（TX）：作用是防止两个事务同时修改相同的数据行。当一个事务需要修改一行数据时，就需对此行数据加锁。此为粒度最精细的锁。<br/>表级锁（TM）：作用是对并发的 DDL 操作进行访问控制，例如防止在 DML 语句执行期间相关的表被变更或移除。表级锁（TM）具备一下几种模式：行共享（row share，RS），行排他（row exclusive，RX），共享（share，S），共享行排他（share row exclusive，SRX），及排他（exclusive，X）<br/><br/>我们来做个测试，打开一个Session并且获得此Session ID为38,先执行查询<br/><br/>SQL&gt; sel&#101;ct * from SONIC_TEST;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp; ID VALUE<br/>------- -----<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 AAAA<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 BBBB<br/><br/>事务A开始对第一行up&#100;ate，但是暂不提交<br/><br/>SQL&gt; up&#100;ate SONIC_TEST set VALUE=&#39;CCCC&#39; wh&#101;re ID=1;<br/> <br/>1 row up&#100;ated<br/><br/>查看此时生成的锁的情况<br/>&nbsp;&nbsp;<br/>SQL&gt; sel&#101;ct TYPE,LMODE,REQUEST from v$lock wh&#101;re SID=38;<br/> <br/>TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LMODE&nbsp;&nbsp;&nbsp;&nbsp;REQUEST<br/>---- ---------- ----------<br/>TM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br/>TX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br/><br/>发现事务A(Session ID=42)产生了两个锁，类型为 TM 与 TX，然后打开事务B，针对ID=1的行进行操作<br/><br/>SQL&gt; up&#100;ate SONIC_TEST set VALUE=&#39;DDDD&#39; wh&#101;re ID=1;<br/><br/>发现此条语句并不执行，查看此Session的状态<br/><br/>SQL&gt; sel&#101;ct sid,status,event,state from v$session wh&#101;re SID=42;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SID STATUS&nbsp;&nbsp; EVENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; STATE<br/>---------- -------- --------------------------------- -------------------<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;42 ACTIVE&nbsp;&nbsp; enq: TX - row lock contention&nbsp;&nbsp;&nbsp;&nbsp; WAITING&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>看到此事务在等待TX锁，这就是行级锁（TX）的作用，若此时事务B针对ID=2的行进行操作<br/><br/>SQL&gt; up&#100;ate SONIC_TEST set VALUE=&#39;CCCC&#39; wh&#101;re ID=2;<br/> <br/>1 row up&#100;ated<br/><br/>可以看到可以成功 up&#100;ate，由此可见，行级锁（TX）只对数据所在行做锁定<br/><br/>再来看一下另外一个表级锁（TM）的作用，同样如果在事务A还没有提交的时候，如果事务B对该表进行DDL操作，比如说dro&#112;该表<br/><br/>SQL&gt; dro&#112; table SONIC_TEST purge;<br/> <br/>dro&#112; table SONIC_TEST purge<br/> <br/>o&#114;A-00054: resource busy and acquire with NOWAIT specified<br/><br/>会报错，提示资源繁忙，这就是表级锁（TM）的作用。]]></description>
		</item>
		
			<item>
			<link>http://www.stblog.net/article/tech/data_consistency_isolation.htm</link>
			<title><![CDATA[Oracle数据一致性之事务隔离级别]]></title>
			<author>sonic.tang@hotmail.com(Sonic)</author>
			<category><![CDATA[技术学习]]></category>
			<pubDate>Wed,19 May 2010 23:08:23 +0800</pubDate>
			<guid>http://www.stblog.net/default.asp?id=464</guid>
		<description><![CDATA[自认为对 o&#114;acle Concept 已经有了比较不错的了解，陆续跟一些资深的 DBA 谈到底层的运作机制跟实现原理的时候，才发现基础依旧不够扎实，故准备花点时间从头过一遍 Concept，并且将理论通过实验来逐一验证，先从数据的一致性开始。<br/><br/>ANSI/ISO SQL 标准（SQL92）定义了四种事务隔离级别，分别为 Read uncommitted, Read committed, Repeatable read, Serializable，此四种隔离级别是针对多用户模式下出现的三种现象所定义，此三种现象分别为 dirty read, nonrepeatable read, phantom read<br/><br/>dirty read（脏读）是指一个事务读取了被其他事务写入但还未提交的数据。 <br/>nonrepeatable read（不可重复读）是指一个事务再次读取其之前曾经读取过的数据时，发现数据已被其他已提交的事务修改或删除。 <br/>phantom read（幻想读）是指事务按照之前的条件重新查询时，返回的结果集中包含其他已提交事务插入的满足条件的新数据。 <br/><br/>o&#114;acle 支持其中两种 Read committed 和 Serializable，并且额外添加一种为 Read only。<br/><br/>Read committed 是 o&#114;acle 默认的事务隔离级别，做个测试来看下针对三种现象的处理方式<br/><br/>SQL&gt; cr&#101;ate table SONIC_TEST (C1 varchar(5));<br/> <br/>Table cr&#101;ated<br/><br/>SQL&gt; ins&#101;rt into SONIC_TEST values (&#39;AAAA&#39;);<br/> <br/>1 row ins&#101;rted<br/> <br/>SQL&gt; commit;<br/> <br/>Commit complete<br/><br/>事务A执行查询<br/><br/>SQL&gt; sel&#101;ct * from SONIC_TEST;<br/> <br/>C1<br/>-----<br/>AAAA<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>切换事务B执行up&#100;ate但是没有commit<br/><br/>SQL&gt; up&#100;ate SONIC_TEST set C1=&#39;BBBB&#39;;<br/> <br/>1 row up&#100;ated<br/><br/>回到事务A再次执行查询<br/><br/>SQL&gt; sel&#101;ct * from SONIC_TEST;<br/> <br/>C1<br/>-----<br/>AAAA<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>显然事务隔离级别 Read committed 阻止了 dirty read，继续<br/><br/>此时事务B执行commit，然后再回到事务A，进行同样的查询<br/><br/>SQL&gt; sel&#101;ct * from SONIC_TEST;<br/> <br/>C1<br/>-----<br/>BBBB<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>这时候数据产生了变化，也就是说 Read committed 没有阻止 nonrepeatable read，继续<br/><br/>事务B中进行一个ins&#101;rt语句<br/><br/>SQL&gt; ins&#101;rt into SONIC_TEST values (&#39;CCCC&#39;);<br/> <br/>1 row ins&#101;rted<br/> <br/>SQL&gt; commit;<br/> <br/>Commit complete<br/> <br/>回到事务A再次用同样语句查询<br/><br/>SQL&gt; sel&#101;ct * from SONIC_TEST;<br/> <br/>C1<br/>-----<br/>BBBB<br/>CCCC<br/><br/>显然 Read committed 也没有阻止 phantom read<br/><br/>-----------------------------------------------------我是分割线----------------------------------<br/><br/>我们继续对事务隔离级别 Serializable 做同样的测试:<br/><br/>将数据恢复到原始状态，并且事务A的隔离级别调整为 Serializable<br/><br/>SQL&gt; truncate table SONIC_TEST;<br/> <br/>Table truncated<br/> <br/>SQL&gt; ins&#101;rt into SONIC_TEST values (&#39;AAAA&#39;);<br/> <br/>1 row ins&#101;rted<br/> <br/>SQL&gt; commit;<br/> <br/>Commit complete<br/><br/>SQL&gt; alt&#101;r session set isolation_level=serializable;<br/> <br/>Session alt&#101;red<br/><br/>SQL&gt; sel&#101;ct * from SONIC_TEST;<br/> <br/>C1<br/>-----<br/>AAAA<br/><br/>切换到事务B,执行up&#100;ate操作但是不执行commit<br/><br/>SQL&gt; up&#100;ate SONIC_TEST set C1=&#39;BBBB&#39;;<br/> <br/>1 row up&#100;ated<br/><br/>回到事务A，重新查询<br/><br/>SQL&gt; sel&#101;ct * from SONIC_TEST;<br/> <br/>C1<br/>-----<br/>AAAA<br/><br/>显然事务隔离级别 Serializable 也阻止了 dirty read，继续<br/><br/>此时事务B执行commit，然后再回到事务A，进行同样的查询<br/><br/>SQL&gt; sel&#101;ct * from SONIC_TEST;<br/> <br/>C1<br/>-----<br/>AAAA<br/><br/>这时候发现虽然事务B中对数据进行了更改，并且commit，但是事务A中读取到的依旧是做修改前的数据，这个表明事务隔离级别 Read committed 阻止了 nonrepeatable read，继续<br/><br/>事务B中进行ins&#101;rt<br/><br/>SQL&gt; ins&#101;rt into SONIC_TEST values (&#39;CCCC&#39;);<br/> <br/>1 row ins&#101;rted<br/> <br/>SQL&gt; commit;<br/> <br/>Commit complete<br/><br/>返回事务A再次查询<br/><br/>SQL&gt; sel&#101;ct * from SONIC_TEST;<br/> <br/>C1<br/>-----<br/>AAAA<br/><br/>数据依旧没有变化，表明事务隔离级别 Read committed 同样阻止了 phantom read。<br/><br/>结合测试，我们很容易得出结论<br/>已提交读取（read committed）允许 dirty read，不允许 read uncommitted，不允许 phantom read<br/>串行化（rerializable）不允许 dirty read，不允许 read uncommitted，不允许 phantom read<br/><br/>而如果在同时支持此四种事务隔离级别的 SQL Server 中对另外两种隔离级别也做测试，会得出最后的结论如下<br/><br/><img src="http://www.stblog.net/download.asp?id=80" border="0" alt=""/><br/><br/>这个时候表 SONIC_TEST 中的数据实际上已经被变更了，但是事务A因为运行在 rerializable 隔离级别下，所以查询出来的结果依旧是修改前的，那么如果这个时候事务A如果也对该表做 up&#100;ate 操作会发生什么情况呢？继续测试<br/><br/>事务A中对表进行up&#100;ate操作<br/><br/>SQL&gt; up&#100;ate SONIC_TEST set C1=&#39;DDDD&#39;;<br/> <br/>up&#100;ate SONIC_TEST set C1=&#39;DDDD&#39;<br/> <br/>o&#114;a-08177: can&#39;t serialize access for this transaction<br/><br/>出现 o&#114;a-08177 错误，更新失败，那么 o&#114;acle 具体是如何来控制这样的机制的呢？且听下回分解:)<br/>]]></description>
		</item>
		
</channel>
</rss>
