Oracle SQL 事务及触发器

来源:互联网 发布:mac系统字体库 编辑:程序博客网 时间:2024/06/04 23:20

事务

一个事务的生命周期包含三个部分:
1. 事务开始
2. 事务执行
3. 事务结束

Oracle不会显式声明事务开始,而是由Oracle自行处理

commit
rollback
set point
rollback to point

事务的属性和隔离级别

read only 只读
read write 读写
serializable 隔离级别
隔离级别的事务是串行化事务,串行化事务与只读事务,具有完全相同的隔离级别.对外界其他事务对数据库的修改操作是没有认知的.
read commited

set transaction read only;

事务的处理原则

  1. Atomicity 原子性:整个事务所有操作是一个逻辑整体,如同原子一样不可分割,要么都成功,要么都失败;
  2. Consistency 一致性:事务结束后,无论是提交还是回滚,数据库中的数据的状态必须保持一致
  3. Isolation 隔离性:多个事务可能同时执行,这些事务之间彼此保持相互独立,不能互相影响.
  4. Durablity 持久性:一旦提交了事务处理,那么事务处理的结果必须要进行持久化.比如写入磁盘,当数据库重新启动时,数据的状态必须和事务结束时数据的状态保持一致.

隔离级别有几种情况需要注意:

  1. 脏读取:一个事务在执行,可能读取到外界其他事务对数据的修改,这些修改是尚未提交的修改,可能被rollback.这种现象被叫做脏读取(抢锁).
    解决方式:with(updlock)

  2. 不可重读:同一事务中,前后两次读取数据表同一条记录,所获得的结果可能是完全不同的.这个现象叫做不可重读,原因是在第一遍读取和第二遍读取之间,有外界的其他事务对数据源做了修改.这种修改是其他事务结束后对数据的影响,即其他事务修改了数据,并提交了修改.这种修改可以被当前事务识别.
    解决方式:数据共享锁

    如果发生了不可重读,是否会发生脏读?
    答:不会,脏读取是事务未提交导致的,不可重读是事务已提交导致的.

  3. 影像读取(幻影读取,影分身):在同一事务中,前后两次执行相同的查询,第一次查询所得到的结果集仍然保存在第二次查询的结果集中,并且没有任何改变.当然在第二次查询中可能有新的记录加入.

SQL92标准规定的4个隔离级别(针对三种读取方式是否允许而设立的),三种读取方式其实是指当前事务对数据库状态变化的敏感度:

隔离级别 脏读取 不可重读 影像读取 非提交读取(Read UnCommited) 允许 允许 允许 已提交读取(Read Commited) 禁止 允许 允许 可重复读取(Repeatable Read) 禁止 禁止 允许 串行读取(Serializable Read) 禁止 禁止 禁止

Oracl只采用了两种:已提交读取和串行读取.

触发器

其他

乐观锁
悲观锁

类图(小组为单位)

原创粉丝点击