当面试官问起:谈一下你对数据库事务的理解,你这么回答就对了。

在回答这个问题的时候首先要考虑的是这里面包含了哪些知识点是我们要回答的,
第一个要点:什么是事务;
第二个要点:数据库的基本特性是什么?
第三个要点:什么是事务隔离,有哪些事务隔离级别?

什么是事务
数据库中的事务是作为单个逻辑工作单元执行的一系列操作。(多条 SQL 语句,要么全部执行成功,要么全部执行失败。)
数据库要支持事务操作必须满足四个特性,也就是常说的ACID:
A:原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败,即张三给李四转账,要么张三钱减少李四钱增多,要么张三和李四钱都不变。
C:一致性(Consistency):一个事务执行之前和执行之后都必须处于一致性状态,即数据的完整性。张三和李四各有一千块,张三给李四转100,张三的钱就要变成900,李四的钱要变成1100
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)
数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行(相当于加了表锁)。

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

发布了227 篇原创文章 · 获赞 77 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/m2606707610/article/details/103470040