超级流量包30元2G的移动业务序号号是什么

Oracle PL/SQL 事物处理 银行转账
时间: 22:06:15
&&&& 阅读:515
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&Oracle数据库中的事务处理:添加,修改,删除时需要使用事务处理(显示事务)。
1.事务的分类显示事务(添加,修改,删除)和隐式事务(除了添加,修改,删除)。
2.事务的执行方式:自动提交(jdbc)或手动提交。
  在添加,修改,删除时,是否需要编写
3.事务的应用:当一个操作对应多条添加,修改,删除语句时,需要通过事务处理,来维护数据的一致性。
  事务的提交和事物的回滚。
1 --实现银行转账的效果,commit表示事物执行,更新到数据库
2 update JSB_TEST set Money=Money+300 where Id=1;
3 update JSB_TEST set Money=Money-300 where Id=2;
PRAGMA EXCEPTION_INIT(v_error,-2290);
update JSB_TEST set Money=Money+300 where Id=1;
update JSB_TEST set Money=Money-300 where Id=2;
dbms_output.put_line(‘转账成功‘);
9 exception
when v_error then
11 --事物回滚
dbms_output.put_line(‘转账失败‘);
&标签:&&&&&&&&&&&&&&&&&&原文:/acm-bingzi/p/3829869.html
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!Oracle死事物回滚
死事务,一般是事务正在跑的时候,被kill掉了,或者数据库shutdown
abort了,那么当数据库再次启动的时候,这些事务就需要做回滚。
可以通过下面的语句查到回滚的事务:
select * from v$fast_start_
select * from x$ktuxe where KTUXECFL='DEAD' AND
KTUXESTA!='INACTIVE'
根据上面的语句,我们可以查到事务的undo的segment
id(USN或者KTUXEUSN),undo的slot(SLT或者KTUXESLT),和undo的sequence(SEQ或者KTUXESQN)。
根据USN,我们可以查到undo segment:
select * from v$rollname where usn=xxx
根据上面的语句,我们可以dump出undo block:
alter system dump undo block ""
alter system dump undo block "_SYSSMU33$" XID 33 56 7463;
然后根据dump出来的trace file,可以判断object number(objn)或者object id(objd)
cat xxx.trc |grep objn
* Rec #0x45 slt:0x1f objn:x00092c2a) objd:601130
tblspc:20(0x)
* Rec #0x44 slt:0x1f objn:x00092c2a) objd:601130
tblspc:20(0x)
* Rec #0x43 slt:0x1f objn:x00092c2a) objd:601130
tblspc:20(0x)
* Rec #0x42 slt:0x1f objn:x00092c2a) objd:601130
tblspc:20(0x)
* Rec #0x41 slt:0x1f objn:x00092c2a) objd:601130
tblspc:20(0x)
* Rec #0x40 slt:0x1f objn:x00092c2a) objd:601130
tblspc:20(0x)
* Rec #0x3f slt:0x1f objn:x00092c2a) objd:601130
tblspc:20(0x)
&& 此时,我们根据object
id,可以在数据库里面找到回滚的object的对象:
select * from dba_objects where
object_id='601130';
&& 此时,如果你select
count(*) from 这个表,你会发现在回滚完前,这个很简单的select操作会一直处于”db file sequential
read”的等待,而且对应的p1是file file,是undo 表空间的数据文件。
我们继续,要查回滚死事务的时间,可以利用x$ktuxe,注意看其单位时间内减少了多少KTUXESIZ,即减少了多少个undo
block。根据这个速度,可以估算回滚速度。注,这个速度只是大概的,有时候往往会非线性的减少。
加快回滚速度,我们需要用到一个参数fast_start_parallel_rollback,这个参数默认是low,即2倍cpu数的并发度,进行并发的回滚。我们可以设置成high,即为4倍cpu数的并发度进行回滚。
而high的时候,有时会用去比较多的资源,特别是cpu资源,会看到很多并发进程ora_pnnn,同时去查v$px_session的话,会发现他们的qcsid是smon的进程。在很高的并发度下,会影响生产的稳定,有时甚至撑爆了process数导致应用无法连接,因此需要特别的注意。我们对fast_start_parallel_rollback进行调整,可以调整成low甚至false。
而并发度如果是high或low,4倍或2倍的cpu数,也会受到另外一些参数的影响,如PARALLEL_MAX_SERVERS,这个才是真正最大的并发度设置。
PARALLEL_MAX_SERVERS这个参数的默认值为PARALLEL_THREADS_PER_CPU * CPU_COUNT *
concurrent_parallel_users * 5。PARALLEL_THREADS_PER_CPU
和CPU_COUNT都是初始化参数。concurrent_parallel_users 根据是否启用automatic memory
management ,如果禁用automatic memory management
则这个值为1,如果pga自动管理则这个值是2,如果是automatic memory management
启用,则这个值是4。
另外,我们还可以_cleanup_rollback_entries,从默认值100改到400,来加快并发回滚的速度,该参数的意义是number
of undo entries to apply per transaction clean。
除了上面说的加快,或者减慢(参数往小了调),我们还可以暂时禁用smon的恢复,用10513的事件:
SQL& oradebug setorapid 'SMON's Oracle
SQL& oradebug event 10513 trace name context forever, level
恢复使用:
SQL& oradebug setorapid 'SMON's Oracle
SQL& oradebug event 10513 trace name context off
那么在什么情况下我们需要加大并发,什么时候需要串行?
在一般情况下,并发的回滚总是比串行的快,我们一般在系统资源可以接受的范围内采用并发回滚,但是,有一个情况例外,就是并发的子进程之间存在资源冲突的情况。
在并发子进程之间需要的资源冲突时,往往此时smon的等待事件是长期处于Wait for stopper
event to be increased,而子进程的等待事件是较多出现Wait for a undo
record。此时,就是子进程冲突了。并发的回滚速度反而不如串行的回滚速度。
冲突时,我们需要把fast_start_parallel_rollback 改成 false。
查询视图V$FAST_START_TRANSACTIONS中字段UNDOBLOCKSDONE,UNDOBLOCKSTOTAL估算smon恢复进度,这里涉及到参数FAST_START_PARALLEL_ROLLBACK的设置,设置方法可以查看Oracle文档。需要注意的是Oracle在回滚大事务并行回滚参数设置存在bug,这时候你可以查询视图v$fast_start_servers中字段STATE
,如果只有一进城处于RECOVERING,其他进程处于IDLE,则可考虑将FAST_START_PARALLEL_ROLLBACK设置为false,关闭并行恢复。如果所有进程都处于RECOVERING状态,则可以考虑加大恢复进程,将其设置为high。
SQL&set linesize 100
SQL&alter session set NLS_DATE_FORMAT='DD-MON-YYYY
HH24:MI:SS';
SQL&select usn, state, undoblockstotal "Total", undoblocksdone
"Done", undoblockstotal-undoblocksdone
"ToDo",decode(cputime,0,'unknown',sysdate+(((undoblockstotal-undoblocksdone)
/ (undoblocksdone / cputime)) / 86400))
"Estimated time to complete"
from v$fast_start_
&&& dump undo
segment head,查看跟踪文件
SQL& select segment_id, file_id,block_id from
DBA_ROLLBACK_SEGS;
SEGMENT_ID&&&
FILE_ID&& BLOCK_ID
---------- ---------- ----------
0&&&&&&&&&
1&&&&&&&&&
1&&&&&&&&&
2&&&&&&&&&
2&&&&&&&&&
3&&&&&&&&&
4&&&&&&&&&
5&&&&&&&&&
6&&&&&&&&&
7&&&&&&&&&
8&&&&&&&&&
9&&&&&&&&&
10&&&&&&&&&
11 rows selected.
SQL&& alter system dump datafile 2 block
System altered.
显示部分跟踪文件,从state为10可以看出该slot有未提交的事务,占用的block数为0x0000035e,转化为10进制为862个,这和v$transaction中used_ublk字段数值吻合。
& index& state
uel&&&&&&&&
scn&&&&&&&&&&&
dba&&&&&&&&&&&
parent-xid&&&
------------------------------------------------------------------------------------------------
0x00& 0x4058&
0xffff& 0xcae&
0x& 0x00000&
0x00& 0x4057&
0x0003& 0xa3b&
0x& 0x00000&
0x80& 0x4058&
0x0008& 0xfa5&
0x00800c8c& 0x00000&
0x0000035e&& 0x0000000
观察Oracle内部表x$ktuxe [k]ernel layer [t]ransaction layer [u]ndo
transaction [e]ntry
SQL& desc& x$ktuxe
Name&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
----------------------------------------- --------
----------------------------
ADDR&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
INDX&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
INST_ID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXEUSN&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXESLT&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXESQN&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXERDBF&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXERDBB&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXESCNB&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXESCNW&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXESTA&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
VARCHAR2(16)
KTUXECFL&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
VARCHAR2(24)
KTUXEUEL&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXEDDBF&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXEDDBB&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXEPUSN&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXEPSLT&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXEPSQN&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
KTUXESIZ&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
SQL& select distinct ktuxesiz from x$ktuxe where
KTUXESTA='ACTIVE';
& KTUXESIZ
----------
进一步利用该内部表可以查看死事务的恢复进度
select * from x$ktuxe where ktuxecfl = 'DEAD' and ktuxesta =
'ACTIVE';
初步估算事务恢复进度,注意KTUXEUSN,KTUXESLT为变量
1&&& select usn,
state, undoblockstotal "Total", undoblocksdone "Done",
undoblockstotal-undoblocksdone "ToDo",
decode(cputime,0,'unknown',sysdate+(((undoblockstotal-undoblocksdone)
/ (undoblocksdone / cputime)) / 86400)) "Estimated time to
& 3*&& from
v$fast_start_transactions
USN STATE&&
Total&&&&&
Done&ToDo Estimated time to compl
---------- ---------------- ---------- ---------- ----------
-----------------------
RECOVERING&&&&&&&
1263593&&&
718792&&&&
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。软件开发的家园,编程爱好者的天地.
&&|&&&&|&&
oracle8i回滚段表空间出现坏块的解决方法
来源:互联网
今天早上刚到公司便接到网通客户的投诉电话,说网管数据库出问题了,数据库有坏块,回滚段里的部分数据不能读取,需要帮忙解决。我查看了一下swappALRT.log文件,发现有以下错误:Tue Sep 21 10:34:08 2004
Errors in file E:\Oracle\admin wapp\bdump wappSMON.TRC:ORA-01578: ORACLE data block corrupted (file # 2, block # 24497)ORA-01110: data file 2: 'E:\ORACLE\ORADATA WAPP\RBS01.DBF'原来是回滚段表空间数据文件有坏块了。知道了问题的所在,马上解决,我已经想好了思路,就是新建一个回滚段表空间,把以前坏了的回滚段表空间drop掉,在新的回滚段表空间上建回滚段,所要建的回滚段和以前的一摸一样,让以后产生的回滚数据都写到新建的回滚段上。思路清楚,马上开始行动了。?首先停到listener,不答应有新的应用连到数据库上做操作,然后down掉数据库,为了清除掉已有的数据库会话连接资源:$lsnrctl stop
LSNRCTL for Solaris: Version 8.1.7.3.0 - ProdUCtion on 21-SEP-:36(c) Copyright 1998 Oracle Corporation.? All rights reserved.Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ipasdb)(PORT=1521)))The command completed successfully.$sqlplus internal/oracleSQL*Plus: Release 8.1.7.0.0 - Production on Tue Sep 21 17:41:24 2004(c) Copyright 2000 Oracle Corporation.? All rights reserved.Connected to:Oracle8i Enterprise Edition Release 8.1.7.3.0 - 64bit ProductionWith the Partitioning optionJServer Release 8.1.7.3.0 - 64bit ProductionSQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL>startup restrict (以受限模式启动数据库,为了防止其他用户登陆进来做相关操作,这时候只答应治理员登陆)查找回滚段对应的表空间: SQL> select tablespace_name,status from dba_ TABLESPACE_NAME??????????????? STATUS
------------------------------ ---------SYSTEM???????????????????????? ONLINETOOLS????????????????????????? ONLINERBS??????????????????????????? ONLINETEMP?????????????????????????? ONLINEUSERS????????????????????????? ONLINEINDX?????????????????????????? ONLINEDRSYS????????????????????????? ONLINEWACOS????????????????????????? ONLINENMS??????????????????????????? ONLINETEST?????????????????????????? ONLINEFS???????????????????????????? ONLINEPERFSTAT?????????????????????? ONLINE12rows selected.回滚段表空间为RBS.查看当前回滚段表空间里是否有活动的事物:SQL> SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk? FROM v$session s,v$transaction t WHERE s.saddr=t.ses_no rows selected.没有活动事物,太好了,可以放心的drop回滚段了,这正是我想要的结果。接下来查找回滚段存储参数信息:SQL> col tablespace_name format a10
本文关键词:
以下留言只代表网友个人观点,不代表本站观点.您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
Oracle9i新特性UndoSpace管理.doc 11页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:150 &&
你可能关注的文档:
··········
··········
Oracle9i新特性:UndoSpace管理作者:Lunar控制Undo空间的初始化参数是什么? 2可以使用多个Undo表空间么? 4如何在SMU或者AMU模式下监视Undo空间的使用? 6如何减少回滚段的竞争? 10总结 11在Oracle9i之前,Oracle使用回滚段来管理Undo,即事务的读一致性是通过回滚段来保证的。在Oracle9i中,已经可以有两种解决方法来维护事务的读一致性,即使用自Oracle6以来就一直使用的回滚段,或者是使用UndoTablespace来进行的自动重做管理(system-managedundo(SMU)或者automaticallymanagedundo(AMU)),但是这两种方法不能同时使用。当一个事务开始的时候会被分配一个回滚段来存储数据修改前(事务开始前)的前印象。通常,ORACLEDBA不得不花很多时间和精力来考虑undo空间的设计和使用:在数据库中设置足够多数量的回滚段是非常重要的。太少的回滚段会导致新事物尝试写回滚段时的等待。太多的回滚段也许对于提高不了事务的并发处理却浪费了大量空间。回滚段的大小要适当。如果回滚段太小,并且有长时间运行的事务或者大事务就会需要更多的空间。回滚段就会扩张到表空间中剩余的自由空间中。如果回滚段需要的(扩张的)空间比表空间中的可用空间多,这个事务就会失败。回滚段的extents应该设置为合适的尺寸。理想情况下,一个事务应该正好在一个回滚段的extents中。如果一个事务比这个extents大,这个事务就会从一个extent环装延伸到同一个回滚段中的下一个extents。过多的环绕就会导致性能的降低喝内部空间的使用问题。在Oracle9i以前,回滚段不得不通过DBA手工管理。关于回滚段尺寸和数量的不恰当地选择都会对系统和并发事务有重大的性能影响。在Oracle9i允许使用两种方法管理回滚段:手工方式。这种方式就是我们通常说的rollback-managedundo(RMU)。它是通过把UNDO_MANAGEMENT参数设置为MANUAL。手工方式本质上和Oracle9i以前的回滚段管理是一样的。自动管理。这种方式就是我们通常说的system-managedundo(SMU)或者automaticallymanagedundo(AMU)。它是通过把UNDO_MANAGEMENT参数设置为AUTO。使用这种方式,Oracle可以自己管理Undo空间的使用,它自己考虑Undo空间的使用,UndoBlocks的竞争和维护读一致性。使用这种方式,Oracle允许DBA给Undo空间分配一个单独的Undo表空间,UndoSegments就会自动的创建在在Undo表空间中,并且这些UndoSegments的创建,删除等工作全部由Oracle来维护。Oracle9i允许DBA把Oracle9i数据库配置为RMUorSMU模式,但是即便是使用SMU模式,DBA也还是要考虑UNDO表空间的大小。此外所有的UndoSegments在Undo表空间中具有相同的尺寸,对于混合型事务的应用,这种设置是很难的。比如说,有些应用中,有一些长时间运行的事务和改变大量数据的事务运行,同时还有其他一些小事务(生命周期很短的事务)不需要改变很多数据。控制Undo空间的初始化参数是什么?UNDO_MANAGEMENT:这个参数确定了Undo空间的管理方式。该参数是个静态参数(不可以动态修改)。如果设置为MANUAL,则使用rollback-managedundo(RMU)管理模式;如果设置为AUTO,则使用system-managedundo(SMU)或者automaticallymanagedundo(AMU)管理模式。在Oracle9i数据库中,AUTO是缺省值。UNDO_TABLESPACE:只有使用system-managedundo(SMU)或者automaticallymanagedundo(AMU)管理模式的时候才需要设置这个参数。它指定了SMU或者AMU所使用的Undo表空间(该表空间必须是已经创建的表空间)。这个设置可以通过ALTERSYSTEM命令动态改变。如果忽略设置这个参数,那么数据库中的第一个Undo表空间就会被使用,如果没有可用的Undo表空间,SYSTEM回滚段就会被使用。创建UndoTablespace:SQL&CREATEUNDOTABLESPACEUNDO_TEST2DATAFILE'E:\TEST_TEST.ora'SIZE10M3AUTOEXTENDONNEXT2MMAXSIZE700M4/表空间已创建。SQL&
UNDO_RETENTION:只有使用system-managedundo(SMU)或者automaticallymanage
正在加载中,请稍后...

我要回帖

更多关于 天下三群雄序列号礼包 的文章

 

随机推荐