简述一下你对mysql事物的理解_面试题:说说你对数据库事务的理解

在回答这个问题的时候首先要考虑的是这里面包含了哪些知识点是我们要回答的,

第一个要点:什么是事务;

第二个要点:数据库的基本特性是什么?

第三个要点:什么是事务隔离,有哪些事务隔离级别?

什么是事务

数据库中的事务是作为单个逻辑工作单元执行的一系列操作。(多条 SQL 语句,要么全部执行成功,要么全部执行失败。)

数据库要支持事务操作必须满足四个特性,也就是常说的ACID:

A:原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败

C:一致性(Consistency):一个事务执行之前和执行之后都必须处于一致性状态。

I:隔离性(Isolation):多个事务在执行同一个操作时不能被其他事务干扰。

D:持久性(dependency):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的

什么是事务隔离,有哪些事务隔离级别?

事务的隔离性就是指,多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每个并发的事务间要相互进行隔离。

一般的数据库,都包括以下四种隔离级别:

读未提交(Read Uncommitted)

读提交(Read Committed)

可重复读(Repeated Read)

串行化(Serializable)

读未提交(Read Uncommitted)

读未提交,就是可以读到未提交的内容。

因此,在这种隔离级别下,查询是不会加锁的,也由于查询的不加锁,所以这种隔离级别的一致性是最差的,可能会产生“脏读”、“不可重复读”、“幻读”。

读提交(Read Committed)

读提交,就是读到已经提交了的内容。

这是各种系统中最常用的一种隔离级别,也是SQL Server和Oracle的默认隔离级别。这种隔离级别能够有效的避免脏读,但除非在查询中显示的加锁。“读提交”只能避免“脏读”,并不能避免“不可重复读”和“幻读”。

可重复读(Repeated Read)

可重复读,就是专门针对“不可重复读”这种问题而制定的隔离级别,它可以有效的避免“不可重复读”。并且它也是MySql的默认隔离级别。

当事务启动时,不允许进行“修改操作(Update)”,而“不可重复读”恰恰是因为两次读取之间进行了数据的修改,因此,“可重复读”能够有效的避免“不可重复读”,但却避免不了“幻读”,因为幻读是由于“插入或者删除操作(Insert or Delete)”而产生的。

串行化(Serializable)

数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行(每一行数据都进行了加锁)。

这种级别下,“脏读”、“不可重复读”、“幻读”都不会出现,但是执行效率非常差,性能开销也最大,所以基本没人会用。

你可能感兴趣的:(简述一下你对mysql事物的理解_面试题:说说你对数据库事务的理解)