事务
一个事务的生命周期包含三个部分:
1. 事务开始
2. 事务执行
3. 事务结束
Oracle不会显式声明事务开始,而是由Oracle自行处理
commit
rollback
set point
rollback to point
事务的属性和隔离级别
read only 只读
read write 读写
serializable 隔离级别
隔离级别的事务是串行化事务,串行化事务与只读事务,具有完全相同的隔离级别.对外界其他事务对数据库的修改操作是没有认知的.
read commited
set transaction read only;
事务的处理原则
- Atomicity 原子性:整个事务所有操作是一个逻辑整体,如同原子一样不可分割,要么都成功,要么都失败;
- Consistency 一致性:事务结束后,无论是提交还是回滚,数据库中的数据的状态必须保持一致
- Isolation 隔离性:多个事务可能同时执行,这些事务之间彼此保持相互独立,不能互相影响.
- Durablity 持久性:一旦提交了事务处理,那么事务处理的结果必须要进行持久化.比如写入磁盘,当数据库重新启动时,数据的状态必须和事务结束时数据的状态保持一致.
隔离级别有几种情况需要注意:
脏读取:一个事务在执行,可能读取到外界其他事务对数据的修改,这些修改是尚未提交的修改,可能被rollback.这种现象被叫做脏读取(抢锁).
解决方式:with(updlock)不可重读:同一事务中,前后两次读取数据表同一条记录,所获得的结果可能是完全不同的.这个现象叫做不可重读,原因是在第一遍读取和第二遍读取之间,有外界的其他事务对数据源做了修改.这种修改是其他事务结束后对数据的影响,即其他事务修改了数据,并提交了修改.这种修改可以被当前事务识别.
解决方式:数据共享锁如果发生了不可重读,是否会发生脏读?
答:不会,脏读取是事务未提交导致的,不可重读是事务已提交导致的.影像读取(幻影读取,影分身):在同一事务中,前后两次执行相同的查询,第一次查询所得到的结果集仍然保存在第二次查询的结果集中,并且没有任何改变.当然在第二次查询中可能有新的记录加入.
SQL92标准规定的4个隔离级别(针对三种读取方式是否允许而设立的),三种读取方式其实是指当前事务对数据库状态变化的敏感度:
隔离级别 | 脏读取 | 不可重读 | 影像读取 |
---|---|---|---|
非提交读取(Read UnCommited) | 允许 | 允许 | 允许 |
已提交读取(Read Commited) | 禁止 | 允许 | 允许 |
可重复读取(Repeatable Read) | 禁止 | 禁止 | 允许 |
串行读取(Serializable Read) | 禁止 | 禁止 | 禁止 |
Oracl只采用了两种:已提交读取和串行读取.
触发器
其他
乐观锁
悲观锁
类图(小组为单位)