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

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

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

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

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

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

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

事务处理有两种:1.数据库事务   2.Spring事务(我们一般都用Spring处理事务)

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

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

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

脏读(更新后读取):事务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]

原文地址:https://www.cnblogs.com/lucky-girl/p/8818991.html