数据库事务管理前言
在面试或者是做项目中,对部分重要知识的总结是相当重要的,特别是面试一些必考的知识点还有作为“知识桥梁”的重点知识的总结,我这里先给大家讲一个非常重要的知识点,数据库事务管理,它是连接处理数据库数据和项目体验的“桥梁”,无论是学哪一方面的编程,作为一名合格的程序员必须掌握。
1、什么是事务数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS中的事务管理子系统负责事务的处理。(来自百度百科) 百度百科上面说的很详细但是可能有些同学听不太明白,简单来讲就是一系列操作,要么完全地执行,要么完全地不执行,记住这句话就够了。 2、事务的四大特性ACID原子性(Atomic)(Atomicity) 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。(来自百度百科) 一致性(Consistent)(Consistency) 事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。(来自百度百科) 百度百科上说的有点复杂,其实只要记住一句话,执行完事务之后,所有的数据必须要遵循“能量守恒定律”。 隔离性(Insulation)(Isolation) 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为隔离性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。(来自百度百科) 持久性(Duration)(Durability) 事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。(来自百度百科) 3、不考虑隔离性,会产生的三个问题- 脏读:A事务中读取到了B事务中未提交的数据,造成数据错误
- 不可重复读:A事务中读取到了B事务中已提交的数据,在特定情景下会产生影响,比如生成统一的数据报表
- 虚读(幻读):A事务中读取到了B事务中已提交的新插入的数据,影响同上
4、隔离级别(解决三个问题)1,serializable:可避免脏读,不可重复读,虚读情况发生,但性能较差。这也是为什么我们经常在实体类上添加实现serializable接口的原因。 2,Repeatable read:可避免脏读,不可重复读情况发生。 3,Read committed:可避免脏读情况发生(读取已经提交) 4,Read uncommitted:最低级别,以上情况均无法保证
|