隔离级别
在数据库操作中,为了有效的保证并发读取数据的正确性而提出的
<1>更新丢失:两个事务同时更新一条数据,但第二个事务却中途退出(失效),导致对数据的两个修改都失效了,这是因为系统没有执行任何的锁操作,而并发事件未被隔离开
<2>脏读:两个并发的事务,事务B读取了事务A未提交的数据
<3>不可重复读:两个并发的事务,事务A读取了事务B的数据,事务B更新了数据,并进行了提交,当事务A再次读取事务B时,数据会不一样
1.读未提交( Read unCommitted) —产生脏读,可以通过排它锁实现
(如果一个事务已经开始写数据,则不允许同时写数据,但允许其他事务读数据)
2.读已提交(Read Committed)—避免了脏读,产生不可重复读问题,可通过瞬间共享读锁和排它锁可实现
(读数据的事务允许其他事务继续访问该行数据,但未提交的数据会禁止)
3.重复读(Repeatable read)—避免不可重复读,产生幻读,可通过共享读锁和排他锁可实现
(读取数据的事务会禁止写事务,写事务则禁止任何其他事务)
4.序列化(Serializable)—最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。
(如果仅通过行级锁是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到)
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性的影响也越大,对于多数的应用程序来说,可以优先考把数据库系统的隔离级别设为读提交,它能够避免脏读,而且具有较好的并发性能,尽管它会导致不可重复读,虚读等一些并发性问题,但可以由应用程序采用悲观锁和乐观锁来控制
*Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED
Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ*