1. ACID (Atomic/Consistency/Isolation/Durability)
Atomic: 事务是原子性的,一个事务不能影响另一个事务,事务不可再分。
Consistency: 事物的处理应保持一致性,如对数据库约束的违反,对所有事务是一致的,要么都提交,要么都回滚。
Isolation: 各个事务是相互隔离的,事务之间相互独立
Durability: 事务是可持久的,事务的持久后的消息应确切的告知用户,持久的成功与失败,不依赖计算机的其他持久条件
2. 数据库事物处理中的问题
2.1 Lost update, 两个事物同时操作一行,第二个事物失败,第一个事物的更新也丢失。 (RMDB不会发生)
2.2 Dirty Read:一个事物读到另一个事物未提交的数据 (Default RMDB ISOLATION read commit 不会发生)
2.3 Non Repeatable Read:一个事物两次读取同一行数据,却又不同的结果 (第二次读到另一个事物提交的修改update, Oracle/SqlServer/Mysql default read commit 会发生)
2.4 Phantom Read:同一个事物,第二次读到第一次未出现的数据 (另一事物插入并提交insert, read commit会发生)
2.5 Second Lost updates : (两个事物修改同一行,第一次的修改失效,不是一个问题,但是一种case)
3. 几种数据库隔离级别 :Oracle/SqlServer (都是读提交 read committed) Mysql (Repeatable_read)
4. 关于ResultRet 在取得后的结果集问题 (ReadCommitted, 和 不同数据库的区别,Oracle 使用快照技术,保证的数据在某一时间点上的不可变性)
我们看看Oracle 的ResultSet在forward_only 条件下,它是可以保证结果的一只的
4.1 stmt.executeQuery()
4.2 while(rs.next())
4.3 Insert data into table,
4.4. rs not show the committed data above.
4.5, stmt.executeQuery() again
4.6 while(rs.next)
4.7 rs show the committed data.
ISOLATION | Dirty Read | Non Repeatable Read | Phantom Read |
SERIALIZABLE | No | No | No |
Repeatable Read | No | No | Yes |
Read Committed | No | Yes | Yes |
Read Uncommitted | Yes | Yes | Yes |