博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事物处理与并发控制(1)
阅读量:4040 次
发布时间:2019-05-24

本文共 2485 字,大约阅读时间需要 8 分钟。

 
目标:
l
         Oracle中的事务处理是什么
l
         怎样控制Oracle中的事务处理
l
         Oracle怎样在数据库中实现并发控制,让多个用户同时访问和修改相同的数据表
 
1 什么是事务
事务就是在数据库上完成的一个操作。要么全部执行并且存储需要的操作,要么全部撤销已经进行的操作,使得数据库恢复到没有改变之前的状态。
 
2 事务处理控制语句
Oracle中的一个重要的概念就是没有“开始事务处理”的语句。用户不能显式开始一个事务,事务结束时需要向数据库提交(Commit),或者回滚(Rollback)操作。
l
         COMMIT
l
         ROLLBACK
l
         SAVEPOINT
l
         ROLLBACK TO SAVEPOINT
l
         SET TRANSACTION
l
         SET CONSTRAINTS
 
2.1 COMMIT处理
当提交时,我们需要处理三个任务:
1、 为我们的事务处理生成SCN(系统改变号)。
2、 将所有剩余的已经缓冲的重做日志表项写入磁盘,并且将SCN记录到在线重做日志文件中。由LGWR执行处理。
3、 释放我们的会话所锁定的资源。
 
LGWR会在下列情况之一发生时执行清理工作:
l
         每隔3秒
l
         当SGA中的Redo Log Buffer Cache容量超过1/3的空间,或者包含了1MB或者更多的已经缓冲数据
l
         进行任何事务处理提交
 
 
2.2 ROLLBACK处理
回滚是一项比较耗费资源的操作。当我们不需要存储所作出的修改时,就回滚我们的操作。回滚可以归结为异常处理范畴。
 
2.3 SAVEPOINT 和ROLLBACK TO SAVEPOINT
SAVEPOINT可以在应用中建立保存点。它可以让用户将单独的大规模事务处理分割成一系列较小的部分。
 
2.4 SET TRANSACTION
SET TRANSACTION必须是你的事务处理的第一条语句,用来设置事务之间的隔离级别。
l
         规定事务处理的隔离级别
l
         规定为用户事务处理所使用的特定回滚段
l
         命名用户事务处理
 
 
 
SET TRANSACTION READ ONLY
SET TRANSACTION READ WRITE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL READ COMMITED
 
1、
    READ ONLY
命令
SET TRANSACTION READ ONLY
将会做两件事情。
首先而且最明显的是:它会确保你无法执行修改数据的DML
操作。如果你要执行这样的操作,就会报错。
另外,READ ONLY可以使得我们把数据库视图冻结在某个时间点。
例如:我们需要获得上午10:00使,数据库中某个数据表中的数据,而这张表又与其它很多数据表之间存在复杂的关联关系。数据库的其它用户有可能继续对其它的一些表随时都在进行DML操作。我们如何获得10:00时我们需要的数据?
一种方法是:停止其它用户的所有活动,锁定相关的数据表。
好的方法是:用户可以使用
SET TRANSACTION READ ONLY
语句,冻结10
00
的用户数据库视图。这样你会看到你需要的数据,而且不会影响其它用户的操作。
 
实验:冻结视图
 
打开三个SQL Plus窗口完成实验
要点:在第一个SQL Plus
窗口中设置 SET TRANSACTION READ ONLY
 时间
会话1
会话2
会话3
说明
T1
set transaction read only;
 
 
 
T 2
select count(*) from t;
select count(*) from t;
 
两个事务处理都可以看到2000行
T3
 
 
delete from t where rownum<=500;
从T表中删除500行,但是没有提交
T4
select count(*) from t;
select count(*) from t;
 
由于多版本的作用,所以这两个会话都会看到2000行
T5
 
 
commit;
 
T6
select count(*) from t;
select count(*) from t;
 
会话1仍然会看到2000行,会话2现在将要看到1500行!到提交或者回滚为止,会话1一直在表T中看到2000行
T7
 
 
insert into t
select * from t;
对T表再插入记录,使其记录的数量到达3000行
T8
 
 
commit
 
T9
select count(*) from t;
select count(*) from t;
 
会话1将看到2000行,但是会话2会看到3000行
T10
commit
 
 
 
T11
select count(*) from t;
 
 
会话1将会看到3000行
 
2、
    READ WRITE
默认设置
SET TRANSACTION READ WRITE是默认设置,不会经常使用。
3、
    ISOLATION LEVEL SERIALIZABLE
 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE与READ ONLY有一些类似。当使用了这个命令之后,无论是否出现改变,数据库都会为你进行“冻结”。使得用户完全可以在隔离状态下进行自己的操作,完全隔离其它事务处理对你的影响。
这里主要的区别就是你可以在串行化事务处理中执行任何需要的DML语句。
 
4、
    ISOLATION LEVEL READ COMMITED
这个命令大体相当于将事务处理设置为READ WRITE,由于它是设置隔离层次时Oracle默认操作模式,所以很少使用。如果用户在会话的前面使用ALTER SESSION命令,将用户会话的事务处理的默认隔离层次从READ COMMITED改变为SERIALIZABLE,那么就可能会用到这个命令。使用ISOLATION LEVEL READ COMMITED命令可以重置默认值。
 
5、
    SET CONSTRAINTS
 
 

转载地址:http://yavdi.baihongyu.com/

你可能感兴趣的文章
如何构建高扩展性网站
查看>>
微服务架构的设计模式
查看>>
持续可用与CAP理论 – 一个系统开发者的观点
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
c++字符数组和字符指针区别以及str***函数
查看>>
c++类的操作符重载注意事项
查看>>
c++模板与泛型编程
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
WPF UI&控件免费开源库
查看>>
QT打开项目提示no valid settings file could be found
查看>>
Win10+VS+ESP32环境搭建
查看>>
Ubuntu+win10远程桌面
查看>>
flutter-实现圆角带边框的view(android无效)
查看>>
android 代码实现圆角
查看>>
flutter-解析json
查看>>
android中shader的使用
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
JavaScript的一些基础-数据类型
查看>>