oracle 数据库事务
数据库事务:
事务:逻辑工作单元,包含1至多条语句,要么全部成功,要么全部失败,
以commit结尾持久化更改或以rollback撤销操作
ACID 属性:
Atomic(原子性):
整个事务作为同一个单元要么全部成功要么全部失败。
Consistency(一致性):
事务中的操作保证数据库中的数据不会出现逻辑上不一致的情况,一致性一般会隐含的包括在其他属性之中。
Isolition(隔离性):
事务允许多个用户对统一数据进行那个并发访问,而不破坏数据的正确性和完整性。
同时,并行事务的修改必须与其他并行事务相互独立。由事务的锁来控制
Durabliity(持久性)
事务处理后,事务处理结果必须能够得到固化。
事务是多用户数据库和并发计划的基石。一旦一个事务提交成功,这个事务引起的变化将会变成
永久的,对其他事务是可见的。虽然很多事务执行时间很短,但是在事务提交成功前,事务引起的变化对
其他事务是无效的。所以每个事务必须隔离起来互不干涉(for 数据完整性)。实现这个的机制是锁。
锁:
1.write lock|exclusive lock
在事务执行过程中,排他锁被获取和应用,排他锁在commit||rollback执行是释放。排它锁同时只能被一个
用户获取,所以同时只有一个用户修改
2.read lock|shared lock
shared lock 可以同时被任意多的用户获取用来检索数据。
被加了共享说的数据在这个事务结束前不能加排他锁。其他数据智能读取数据不能修改。
oracle使用共享锁的情况是 select ... for update 语句,其它情况没有共享锁
---reference other:
共享锁(S锁)又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加
S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何
修改。
排他锁(X锁)又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A
加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A
并发和竞争
并发越多,锁之间的冲突就会有多,竞争就越多,性能就会下降。oracle使用multiversion read concurrency
scheme可以大大降低这种竞争。
数据完整性问题:
1.Lost updates
两个修改对同一个数据进行修改,a会覆盖b的修改数据(排他锁设计为了解决这个问题)
2.Dirty reads
数据库允许一个事务读取被另一事务修改的数据,但是这个事务所做的修改还为提交进行持久化,
这些修改可能会被回滚,所以这个数据读取的事务就是不正确的。很多数据库允许脏读以避免排它锁的竞争。
3.Nonrepeatable reads
其他事务修改数据的结果。一个事务特定的条件进行查询数据。在这个事务结束前,查询结果返回后,
另一个事务修改了数据,导致这些数据不再满足原来的查询条件,如果这个条件查询在执行一次,结果就不同。
4.Phantom reads 幻读
一个事务进行查询,在查询结果返回而这个事务结束前,另一事务插入一条新数据也符合前面的查询结果,这是
事务要根据查询结果尽心相应的修改就不准确 了。
Serialization 串行化
oracle多用户并发控制:multiversion read consistency(mvrc)
mvrc确保用户看到的他所需要的数据始终如一。如果另一个用户修改了这些数据,在这个用查询执行的过
程中。oracle会维护一个这个数据在查询开始时的数据版本,如果在查询开始的时候,这些修改数据的事务为提交
,oracle会确保忽视这些事务的修改。查询结果只会在查询开始时,已经提交的事务的基础上找。
1.oralce读数据不加任何锁
2.用户会得到一个完整的数据快照,不受其它事务干扰
oracle 隔离级别:
1.read commit:
statement level serialization
每一个语句,在语句开始时,会获取一个此刻的数据快照。一个事务有多条语句,如果语句之间存在其它完成的事务,
这可能引起不可持续读和幻读。oracle的默认隔离级别
2.serializable
transaction level:一个事务中的语句共享同一个数据快照(在事务开始时存在的数据)
3.read-only
Oracle Concurrency Features 并发特点
1.Rollback segments 回滚片段
回滚片段目的是为了事务回滚到事务前数据信息。当事务开始修改数据块时,首先会把这个时刻的数据快照
写入到rollback segment。rollback segment中的信息是回滚事务和多版本读取数据一致性的前提。
回滚片段不同于重做日志。重做日志是记录数据库所有的事务,当系统突然宕机的时候恢复数据库,