Oracle语句类型

  • DDL:数据定义语句:create,drop,truncate,alter
  • DML:数据操作语句:insert,update,delete,select
  • DCL:数据控制语句:grant,revoke
  • TCL:事务控制语言 commit,rollback
 

事务生命周期

  • 开始事务:当oracle中的SQL语句块中执行第一条DML(数据操作)语句时,即表示事务的开始;
  • 提交事务:当出现commit时,事务被提交;事务的提交还有另外一种方式:DML(数据操作)语句后面执行了DDL(数据定义)语句或者DCL(数据控制)语句时,事务也会被提交
  • 回滚事务:用rollback实现回滚事务;也可以回滚部分事务,但是需要设置保存点:savepoint updatepoin...rollback to updatpoin;
 
总的来说,Oracle数据库的事务由一个或多个DML语句组成,事务中可以包含一个DDL/DCL语句。
Oracle可以自动地标识一个事务,事务是以第一个DML语句开始,当下列事件之一发生时结束:
1、用户执行了commit语句:事务被显式提交
2、用户执行了rollback语句:事务被回滚
3、用户执行了DDL/DCL语句:事务被自动提交
4、用户正常退出SQL Developer:事务被自动提交
5、用户异常退出SQL Developer:事务被自动回滚
6、系统崩溃,包括硬件或者软件故障:事务被自动回滚
 

事务的四大特性

  • 原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
  • 一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  • 隔离性:隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
  • 持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
 

不考虑事务的隔离性带来的问题

  • 脏读:脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
  • 不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
  • 幻读:事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录。
 

事务隔离级别

  • READ UNCOMMITTED:幻读,不可重复读和脏读均允许;
  • READ COMMITTED:允许幻读和不可重复读,但不允许脏读;
  • REPEATABLE READ:允许幻读,但不允许不可重复读和脏读;
  • SERIALIZABLE:幻读,不可重复读和脏读都不允许。
     Oracle默认的隔离级别是READ COMMITTED,即不允许脏读。
 

不好的事务习惯

  • 在循环中提交
  • 使用自动提交
 

Oracle如何避免不可重复读

select ... from ... for update,这样会对目标表进行锁定,其他事务不能对该表进行修改,从而避免了不可重复读。