数据一致性的重要意义举例
银行转帐: A 转500元给B,实际上发生了3句DML语句
1、10:10:10.001: UPDATE A账户 SET 余额=余额-500
3、 10:10:10.003: UPDATE B帐户 SET 余额=余额+500
2、 10:10:10.002: INSERT 转帐交易历史记录
这三个操作必须同时完成,如果有一条部门完成,那么其他也必须回滚,否则数据就不一致。
隐式的事务提交或回滚动作:
Commit, rollback 是显式的提交和回滚语句,还有一些隐式的提交和回滚是大家需要知道并引起注意的:
当如下事件发生是,会隐式的执行Commit动作:
1、数据定义语句被执行的时候,比如新建一张表:Create Table …
2、数据控制语句被执行的时候,比如赋权 GRANT …( 或者 DENY)
3、正常退出 iSQLPlus 或者PLSQL DEVELOPER, 而没有显式的执行 COMMIT 或者 ROLLBACK 语句 。
当如下事件发生时,会隐式执行Rollback 动作:
1、非正常退出 iSQLPlus , PLSQL DEVELOPER, 或者发生系统错误。
在Commit 或者 Rollback前后数据的状态:
1、在数据已经被更改,但没有Commit前 ,被更改记录处于被锁定状态,其他用户无法进行更改;
2、在数据已经被更改,但没有Commit前 ,只有当前Session的用户可以看到这种变更 ,其他Session的用户
看不到数据的变化。
3、在数据已经被更改,并且被Commit后,被更改记录自动解锁,其他用户可以进行更改;
4、在数据已经被更改,并且被Commit后,其他Session的用户再次访问这些数据时,看到的是变化后的数据。
那么同理可知Rollback前后数据的状态及锁的变化。
读一致性:
用户对数据库的访问无非是两种情况
1、读数据 : Select 语句
2、写数据 : Insert 、Delete、Update
如果A用户要读的数据,B用户正在改,那么是否要等B改完再读出来呢? 如何保证在及其相近的时间内,让
多个用户读到一致的数据呢?(假设有用户正在改这一批数据的过程中,尚未提交。。。)
Oracle的“读一致性”概念是指:
1、在任何时候,确保提供数据的一致性视图。
2、一个用户对数据的更改不会影响另一个用户对数据的更改。
3、“读一致性” 确保在同一时刻:
3.1 读数据的人不需要等待写数据的人
3.2 写数据的人不需要等待读数据的人
而“读一致性”的通俗理解就是: 对于有人正在修改过程中的一批数据,在其位提交前,其他用户读到的是
一致的内容。
读一致性实现原理:
当有用户修改数据时,Oracle先把那部分原始数据备份到回滚段,在Commit之前,其他Session用户读到的这
部分数据是回滚段上的; 在提交之后,回滚段被释放