事务管理
1.什么是事务管理
事务管理是指对一系列相关的操作进行管理和控制的过程。在计算机科学领域,事务管理通常与数据库操作密切相关。事务是指一组数据库操作(例如插入、更新、删除),这些操作要么全部执行成功,要么全部不执行。事务管理确保了数据库操作的一致性、可靠性和完整性。
事务管理通常遵循ACID原则,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。原子性要求事务中的操作要么全部执行成功,要么全部回滚到之前的状态;一致性要求事务执行后数据库的状态必须满足预定义的规则;隔离性要求多个并发事务之间相互隔离,互不干扰;持久性要求事务提交后,其结果应该永久保存在数据库中,即使系统崩溃也不会丢失。
通过事务管理,可以确保数据库操作的正确性和可靠性,同时提供了可恢复性和并发控制的机制。1
1.编程式事务2
编程式事务是指手动编写程序来管理事务,即通过编写代码的方式直接控制事务的提交和回滚。在 Java 中,通常使用事务管理器(如 Spring 中的 PlatformTransactionManager
)来实现编程式事务。
编程式事务的主要优点是灵活性高,可以按照自己的需求来控制事务的粒度、模式等等。但是,编写大量的事务控制代码容易出现问题,对代码的可读性和可维护性有一定影响。
2.声明式事务
声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。
开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作!
使用声明式事务可以将事务的控制和业务逻辑分离开来,提高代码的可读性和可维护性。
3.区别
- 编程式事务需要手动编写代码来管理事务
- 而声明式事务可以通过配置文件或注解来控制事务。
2.事务属性
- 原子性
事务是一个不可分割的最小工作单位,事务中的操作要么都发生,要么都不发生
2. 一致性
事务必须是数据库从一个一致性的状态变换到另外一个一致性的状态
3. 持久性
事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
4. 隔离性
一个事务的执行不能被其他事务所干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事物之间互相不能干扰1
3.数据库并发问题
数据库的并发问题是指在多个用户同时访问数据库时可能出现的一系列挑战和风险。主要的并发问题包括以下几个方面:
- 丢失修改:当多个事务同时对相同数据进行修改时,可能会导致其中一个事务的修改被另一个事务覆盖,从而导致数据的丢失。
- 脏读:一个事务在读取了另一个事务未提交的数据后,这个数据发生了改变,而最初的事务所读取的数据已经不再有效。
- 不可重复读:一个事务在读取了某个数据后,另一个事务对这个数据进行了修改,导致第一个事务再次读取同一数据时得到了不同的结果。
- 幻读:一个事务在读取了一批数据后,另一个事务插入了新的数据,导致第一个事务再次读取同一批数据时得到了不同的结果,就好像发生了“幻觉”。
为了解决这些并发问题,数据库系统通常采用锁机制、多版本并发控制(MVCC)、事务隔离级别等技术来保证事务的隔离性和一致性。除此之外,一些先进的数据库系统还提供了乐观并发控制和并发事务的调度器等功能来更好地处理并发问题。
4.事务管理的优势
事务管理的优势包括:
数据一致性:事务管理能够确保所有操作在同一事务中执行,从而保证数据的一致性。
数据可靠性:如果一个操作失败,整个事务会被回滚,保证数据的完整性和可靠性。
并发控制:事务管理可以控制并发操作的影响,避免数据冲突和死锁等问题。
提高性能:事务管理可以通过批处理、预编译语句等方式提高数据库操作的性能。3
5.事务隔离级别
Spring事务隔离级别
隔离级别由低到高【读未提交】=>【读已提交】=>【可重复读】=>【序列化操作】
隔离级别 | 说明 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
ISOLATION_DEFAULT | spring默认数据库的隔离级别 | – | – | – |
ISOLATION_READ_UNCOMMITTED | 读未提交 | √ | √ | √ |
ISOLATION_READ_COMMITTED | 读已提交 | × | √ | √ |
ISOLATION_REPEATABLE_READ | 可重复读 | × | × | √ |
ISOLATION_SERIALIZABLE | 序列化操作 | × | × | × |
6.事务传播行为
指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。
传播行为 | 说明 |
---|---|
REQUIRED【默认】 | 当前如果有事务,Spring就会使用该事务;否则会开始一个新事务(增、删、改) |
SUPPORTS | 当前如果有事务,Spring就会使用该事务;否则不会开始一个新事务(查询) |
MANDATORY | 当前如果有事务,Spring就会使用该事务;否则会抛出异常 |
REQUIRES_NEW | 当前如果有事务,把当前事务挂起,新建事务 |
NOT_SUPPORTED | 当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则该事务挂起 |
NEVER | 当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常 |
NESTED | 当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与REQUIRED一样 |