首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

oracle札记(十七)事务

2012-09-10 
oracle笔记(十七)事务?概念:在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的

oracle笔记(十七)事务

?概念:在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么完全成功执行,完成整个工作单元操作,要么一点也不执行。

?

? 主要特性:确保数据库的完整性。

?

? 对一组SQL语句操作构成事务,数据库操作系统必须确保这些操作的原子性,一致性,隔离性,持久性.

事务的持久性是指在事务处理结束后,它对数据的修改应该是永久的。即便是系统在遇到故障的情况下也不会丢失,这是数据的重要性决定的。

? 根据事务ACID属性,oracle提供了如下的事务控制语句:

?? ????Set transaction 设置事物属性

?? Set constrains? 设置事物的约束模式

? Release? savepoint? 删除存储点

? Rollback 回滚事务 取消对数据库所作的任何操作

? Commit 提交事务 对数据库的操作做持久的保存。

? 3、1设置事物的属性:

???Set transaction的语句可以让用户对事务的以下属性进行设置

???????? 指定事务的隔离层

???????? 规定回滚事务所使用的存储空间

???????? 命名事务

?注意:set transaction只对当前事务有效,事务终止,事务当前的设置将会失效。

事务的隔离性定义了一个事务与其它事务的隔离程度.为了更好的理解隔离层,首先讨论一下并发事务对同一个数据库进行访问可能发生的情况.在并发事务中总体来说会发生如下3种情况

???????? 错读 |脏读

???????? 非重复读取|不可重复读

???????? 假读|幻读

?

??? 错读|脏读:当一个事务修改数据时,另一事务读取了该数据,但是第一事务由于某种原因取消对数据修改,使数据返回了原状态,这是第二个事务读取的数据与数据库中数据部一致.这就叫错读。

?? 非重复读取:是指一个事务读取数据库中的数据后,另一个事务则更新了数据,当第一个事务再次读取其中的数据时,就会发现数据已经发生了改变,这就是非重复读取。非重复读取所导致的结果就是一个事务前后两次读取的数据不相同。

? ?假读|幻读:如果一个事务基于某个条件读取数据后,另一个事务则更新了同一个表中的数据,这时第一个事务再次读取数据时,根据搜索的条件返回了不同的行,这就是假读。

??? 事务中遇到的这些异常与事务的隔离性设置有关,事务的隔离性设置越多,异常就出现的越少,但并发效果就越低,事务的隔离性设置越少,异常出现的越多,并发效果越高。

?? 针对3中读取的数据时产生的不一致现象,在ANSI SQL标准92中定义了4个事务的隔离级别.如下图所示:

隔离层

错读|脏读

非重复读取|不可重复读

假读|幻读

READ UNCOMMITTED(非提交读)

READ COMMITTED(提交读)

Repeatable READ(可重复读)

Serializable(串行读)

?

Oracle支持上述四种隔离层中的两种:read committed 和serializable。除此之外oralce中还定义read only 和 read write隔离层。

?Read committed 这是oracle默认的隔离层。

Serializable:设置事物的隔离层位它时,事务与事务之间完全隔开,事务以串行的方式执行,这并不是说一个事务必须结束才能启动另外一个事务,而是说这些事务的执行的结果于一次执行的事务的结果一致。

Read only和 read write 当使用read only时,事务中不能有任何修改数据库中数据的操作语句,这包括 insert、update、delete、create语句。Read only是serializable的一个子集,区别是read only 只读,而serialzable可以执行DML操作。Read write它是默认设置,该选项表示在事务中可以有访问语句、修改语句.但不经常使用.

?列举如下:

? Set transaction read only

? Set transaction read write

? Set transaction isolation level read committed

? Set transaction isolation level serializable

注意:这些语句是互斥的.即不能够同时设置两个或者两个以上的选项。

什么情况下代表事务的结束呢?

//只读的案例

SQL> set transaction read only;

Transaction set

SQL> select * from users where username='xl';

USERNAME????? PASSWORD????? NAME???????????? ADDRESS???????????? ZIP

-------------------- -------------------- -------------------- -------------------- -------

Xl????????????????? kouxiaolin????????? kouxiaolin????????????????????????????????

SQL> update users set password='123' where username='xl';

update users set password='123' where username='xl'

ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作

//脏读的案例

SQL> set transaction isolation level read committed;

Transaction set

SQL> select * from users where username='xl';

USERNAME????? PASSWORD????? NAME???????????? ADDRESS???????????? ZIP

-------------------- -------------------- -------------------- -------------------- -------

Xl????????????????? kouxiaolin????????? kouxiaolin????????????????????????????????

SQL> update users set password='123' where username='xl';

1 row updated

SQL> select * from users where username='xl';

USERNAME????? PASSWORD????? NAME???????????? ADDRESS???????????? ZIP

-------------------- -------------------- -------------------- -------------------- -------

Xl????????????????? 123???????????????? kouxiaolin????????????????????????????????

SQL> rollback;

数据库:数据库的完整性,参照的完整性,用户自定义的完整性

?

热点排行