Mysql 数据库 事务

数据库事务

  • 数据库的ACID讲解一下。

数据库的ACID是数据库事务的四个基本特性。ACID4个属性分别是:
Atomic原子性,Consistence一致性,Isolation隔离性,Durability持久性。

  • 首先,什么是事务?

事务是数据库内一些操作的合集。比如insert + update合成一个操作。

  • 事务的优势和特性?

事务的特性就是ACID

  • 原子性(Actomic):事务内的操作要么全部执行,要不全部不执行。不会出现执行到一半的情况。如果某一操作执行失败,数据库会进行回滚,回滚到事务执行之前到状态。
  • 一致性(Consistence):一致性是指逻辑上的一致,也就是事务处理的结果是符合预期的。
    比如(A转帐B 500,B转帐A 300),事务过程发生失败,那么中间A和B的账户没有任何改变,这就符合了预期,也就是符合一致性的要求。
  • 隔离性(Isolation):事务在执行完成之前,对于其它事务来说是不可见的。当出现2个或2个以上的事务处理同一块数据时,每个事务可以看作是串形执行的。
  • 持久性(Durability): 事务成功执行之后,所有的更改会被持久保持在数据库中。(也就是硬盘上)目前主流的存储方式是(日志+数据)的方式(Write ahead Logging,WAL)。另一种方式为(Shadow Paging),这种方式不需要纪录日志,节省时间的开销。
  • 与一致性和隔离性内涉及到的脏度、不可重复读、幻读,能讲解下么?
    Mysql 数据库 事务

脏读:一个事务读取了另一个事务未提交的数据(另一个事务有可能RollBack),这个数据有可能是需要回滚的;

不可重复读:在数据库访问过程中,一个事务的两次查询返回了不同的结果。这是由于查询过程中,其它事务更改了查询结果导致。

幻读(虚读):幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样.

丢失修改:两个事务同时读取同一份数据,A事务修改数据为48,B事务修改数据为50,B事务提交的结果会覆盖A事务提交的结果。

  • 数据库内的隔离级别了解吗,能讲解一下么?

隔离性的四个级别
READ UNCOMMITTED(未提交读)
在READ UNCOMMITTED级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别会导致很多问题,从性能上来说,READ UNCOMMITTED不会比其他的级别好太多,但却缺乏其他级别的很多好处,除非真的有非常必要的理由,在实际应用中一般很少使用。

READ COMMITTED(提交读)
大多数数据库系统的默认隔离级别都是READ COMMTTED(但MySQL不是)。READ COMMITTED满足前面提到的隔离性的简单定义:一个事务开始时,只能”看见”已经提交的事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候叫做不可重复读(nonrepeatble read),因为两次执行同样的查询,可能会得到不一样的结果。

REPEATABLE READ(可重复读)
REPEATABLE READ解决了脏读的问题。该隔离级别保证了在同一个事务中多次读取同样记录结果是一致的。但是理论上,可重复读隔离级别还是无法解决另外一个幻读(Phantom Read)的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题。

SERIALIZABLE(串行化)
SERIALIZABLE是最高的隔离级别。它通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,SERIALIZABLE会在读取每一行数据都加锁,所以可能导致大量的超时和锁争用问题。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑采用该级别。

隔离级别的总结
打钩说明该隔离级别还存在这种情况,打X代表该隔离级别已经解决了这种情况:

隔离级别 脏读 不可重复读 幻读

读未提交(Read uncommitted) Y Y Y

读已提交(Read committed) X Y Y

可重复读(Repeatable read) X X Y

可串行化(Serializable) X X X

参考文章
[1] acid (数据库事务正确执行的四个基本要素的缩写)

[2] ACID原则

[3] 理解数据库的事务,ACID,CAP和一致性

[4] 数据库事务ACID和四个隔离级别

[5] [数据库]谈谈数据库的ACID(转)

[6] 什么是数据库ACID?

[7]脏读、不可重复读、幻读

[8] Java与持久相关的锁总结


MCCC & CAP 理论

分布式数据的CAP原则。


面试相关

[1] Java面试中常问的数据库方面问题