【面试题】并发操做时数据库事务怎么处理的

事务(transaction)是由一些列操做序列构成的执行单元,这些单元要么都作,要么不作,是一个不可分割的工做单元。数据库

事务的四种特性:原子性、一致性、分离性、持久性。并发

原子性:指的是事物中包含的全部操做要么全作,要么全不作。spa

一致性:在事物开始之前,数据库处于一致性的状态,事物结束后,数据库也必须处于一致性的状态。事务

分离性:指并发的事务是相互隔离的。即一个事务内部的操做及正在操做的数据必须封锁起来,不被其它企图进行修改的事务看到。io

持久性:持久性意味着当系统或介质发生故障时,确保已提交事务的更新不能丢失。即一旦一个事务提交,DBMS保证它对数据库中数据的改变应该是永久性的,即对已提交事务的更新能恢复。持久性经过数据库备份和恢复来保证。class

事务处理有两种:1.数据库事务   2.Spring事务(咱们通常都用Spring处理事务)date

数据库事务级别有3中:分别是幻读、不可重复读和脏读数据

幻读(读取时,插入):事务T1进行查询操做返回了一个结果集,事务T2此时进行了insert操做,刚好知足事务T1的要求,此时T1并查询一遍,返回的结果集和第一次返回的结果集不一样。查询

不可重复读(读取时,有更新):事务T1进行查询操做返回了一个结果集,事务T2此时进行了update操做,事务T1再查询一遍,两个返回的结果集不一致。di

脏读(更新后读取):事务T1进行了insert/update操做,未提交。事务T2进行查询返回了一个结果集,此时T1进行了回滚,T2读到的其实就是无效的脏数据了。

数据库事务隔离级别有如下四种:

READ UNCOMMITTED 幻想读、不可重复读和脏读都容许。

READ COMMITTED 容许幻想读、不可重复读,不容许脏读

REPEATABLE READ 容许幻想读,不容许不可重复读和脏读

SERIALIZABLE 幻想读、不可重复读和脏读都不容许

OracleOracle不支持脏读,因此数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。

SQL标准所定义的默认事务隔离级别是SERIALIZABLE,可是Oracle 默认使用的是READ COMMITTED,MySql的默承认重复读取(REPEATABLE READ);

设置隔离级别使用 SET TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

相关文章
相关标签/搜索