成为MySQL DBA后,再看ORACLE数据库(十、事务与隔离级别)

一、事务控制语句

事务控制方式在ORACLE和MySQL中有着明显的不同,在ORACLE数据库中,当第一条可执行的SQL语句开始执行时,就隐性地开始了一个事务,然后继续执行随后的SQL语句,直到出现以下情况:1.commit,如果事务遇到commit语句,此前的所有更改将在数据库中永久生效;2. rollback,如果事务遇到rollback(回滚)语句,则此前的所有更改取消;3.如果用户发出一条ddl语句,则ORACLE在执行和提交该ddl语句的结果之前,首先提交作为事务一部分的当前所有dml语句,这被称为隐式提交;4.如果程序结束没有出现错误,则所有更改由数据库隐式提交;5.如果程序崩溃或中止,它此前所做的所有更改被数据库隐式回滚。

因此,ORACLE中的事务是隐式自动开始的,但对于事务的结束处理,则需要用户进行指定的操作。当然ORACLE也可以通过set transaction显示开启事务,但实际中很少这么做。ORACLE的事务控制语句主要有以下几个:1.commit:当此语句跟在一组dml语句后面时,更改将成为永久的更改;2.rollback;当此语句跟在一个或多个dml语句之后,前面的语句所做的更改被撤销,如果没有保留点,则从事务开始起的所有语句都将被回滚;3.savepoint:此语句提供事务的灵活性,帮助设置事务的中间点以便能够回滚(撤销)事务;4.set transaction:指示一个事务的状态,比如set transaction read only设置只读事务。

MySQL事务提交方式为默认提交,即执行每一条增删改DML语句后会默认自动提交,对行锁的获取和释放均很快操作结束,最大程度降低了读写事务的冲突,如果需要人为的开启事务则以begin开始,以commit或rollback结束。需要注意的是,在ORACLE中,有的应用程序使用了ODBC或JDBC,那么有时候这种接口会带一个自动提交,即在每个update语句后面悄悄地加一个commit,如果在开发过程中忽略了这个特性将会导致不好的事务习惯。

二、隔离级别

ORACLE支持三种隔离级别:read committed、serializable、read only,默认的隔离级别是read committed,并且在实际使用中也很少用到其他两种隔离级别。

MySQL的innodb引擎支持ANSI定义的4种隔离级别:read uncommitted、read committed、repeatable read、serializable。MySQL默认的隔离级别是repeatable read,但在实际生产中通常设置为read committed,read committed隔离级别下在一个事务中可以读到其他事务已提交的数据,虽然这种隔离级别在原则上违背了事务ACID中的一致性,但是在实际的业务场景下我们可以容忍不可重复读或幻读的发生。而repeatable read为了解决幻读问题引入了next-key lock。因此,为了提升应用的并发性减少锁等待,read committed是更好的选择。

 三、MVCC

一方面Oracle通过锁定机制实现数据库的并发控制;一方面通过多版本(Multi-versioning Model)模型来进行并发数据访问。通过多版本架构,Oracle实现了读取和写入的分离,使得写入不阻塞读取;读取不阻塞修改。这是 Oracle 数据库区别于其他数据库的一个重要特征。Oracle内部使用SCN作为数据库时钟,每个数据块头部都会记录一个SCN,当数据更改提交后,SCN同时被修改,这个SCN在查询时可以用来进行一致性读判断。Oracle的多版本模型是通过读一致性性实现的,Oracle的read committed隔离级别下每个语句都要获取最新的SCN,假定查询开始的时间为T1,则在查询获取的数据块中,如果数据块的提交SCN小于T1,则Oracle接受该数据,如果提交SCN大于T1或者数据被锁定修改尚未记录COMMIT SCN,则Oracle需要通过回滚段构造前镜像来返回结果,这就是一致性读的本质含义。在ORACLE中所有的读操作都是基于快照的读,写入需要row lock,如果一个查询只是读取信息,那么它永远也不会被阻塞。

posted @ 2024-06-16 09:23  海布里_MySQL  阅读(5)  评论(0编辑  收藏  举报