事务特性

事务定义为一个逻辑工作单元,即一组不可分割的SQL语句。事务有4个基本特性,称为ACID特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性Durability)。
(1)原子性
事务必须是原子工作单元,即一个事务中包含的所有SQL语句组成一个工作单元。
(2)一致性
事务必须确保数据库的状态保持一致,事务开始时,数据库的状态是一致的,当事务结束时,也必须使数据库的状态一致。
例如,在事务开始时,数据库的所有数据都满足已设置的各种约束条件和业务规则,在事务结束时,数据虽然不同,必须仍然满足先前设置的各种约束条件和业务规则,事务把数据库从一个一致性状态带入另一个一致性状态。
(3)隔离性多个事务可以独立运行,彼此不会发生影响。这表明事务必须是独立的,它不应以任何方式依赖于或影响其它事务。
(4)持久性
一个事务一旦提交,它对数据库中数据的改变永久有效,即使以后系统崩溃也是如此。

重点

数据库执行事务或者SQL语句并不是立马提交的。意思就是,你update了一行,这个内容只是存在缓冲器里的,物理数据库还是update之前的老数据。则意味着并发事务的各种问题。手动设置自动提交的语句是:

1
SETAUTOCOMMITON|OFF

或者直接commit命令提交。

保存点

类似于打COD中的节点,可以将数据库的状态回到某个保准点。
语句是:

1
2
3
4
5
6
Rollback ---无差别回到上一次提交数据库的状态。
语法格式:
SAVEPOINT XXX
语法格式:
ROLLBACKTO[XXX]

并行事务

打开两个SQL PLUS登录后。A窗口中,在T表中插入两个行H1,H2。
在A窗口中select * from 可以看见H1,H2。在B窗口中是没有H1,H2的。意思就是H1,H2没有commit,只是存在于缓冲区,并没有物理上修改数据库。
A窗口commit后,B窗口再查看就可以看见H1,H2了。

幻想读

事务T1用指定WHERE子句的查询语句进行查询,得到返回的结果集,以后事务T2新插入一行,恰好满足T1查询中WHERE子句的条件,然后T1再次用相同的查询进行检索,看到了T2刚插入的新行,这个新行就称为”幻想”,像变魔术似的突然出现。

不可重复读

事务T1读取一行,紧接着事务T2修改了该行。T1再次读取该行时,发现与刚才读取的结果不同,此时发生原始读取不可重复。

脏读

事务T1修改了一行的内容,但未提交,事务T2读取该行,所得的数据是该行修改前的结果。然后事务T1提交了该行的修改,现在事务T2读取的数据无效了,由于所读的数据可能是“脏”(不正确)数据引起错误。

事务隔离

为了避免并行的各种问题。

SQL标准支持的事务隔离级别

SQL标准定义了以下4种事务隔离级别,隔离级别从低到高的依次为:
(1)READUNCOMMITTED幻想读、不可重复读和脏读都允许。
(2)READCOMMITTED允许幻想读、不可重复读,但是不允许脏读。
(3)REPETABLEREAD允许幻想读、但是不允许不可重复读和脏读。
(4)SERIALIZABLE幻想读、不可重复读和脏读都不允许。
SQL标准定义的默认事务隔离级别是SERIALIZABLE。

Oracle数据库支持的事务隔离级别

Oracle数据库支持其中两种事务隔离级别:
(1)READCOMMITTED允许幻想读、不可重复读,但是不允许脏读。
(2)SERIALIZABLE幻想读、不可重复读和脏读都不允许。

语句

1
SETTRANSACTIONISOLATIONLEVEL SERIALIZABLE;