Spring 事务管理基本内容及应用

Spring 事务管理

一、什么是事务?作用?

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务的作用:确保数据库操作的一致性、隔离性、持久性和原子性,以维护数据的完整性和可靠性。

二、事务的基本特性(ACID原则)

  1. 原子性(Atomicity): 事务管理确保事务中的所有操作要么全部成功,要么全部失败,不可能在中间环节停滞。如果事务的任何一部分失败,整个事务将被回滚,已经执行的操作将被撤销,数据库回到事务开始前的状态。

  2. 一致性(Consistency): 事务管理确保事务执行前后,数据库保持一致性状态。这包括数据库的完整性约束得到维护没有被破坏。

  3. 隔离性(Isolation): 多个事务可以并发执行,但它们的执行应该互相隔离,一个事务的执行不应该影响其他事务。事务管理通过隔离级别的设置,确保并发执行的事务之间不会产生不一致或意外的结果。

  4. 持久性(Durability): 事务管理确保一旦事务被提交,其所做的修改将是永久性的,即使系统崩溃或发生其他故障也不会导致数据丢失。这通常涉及将事务的修改写入到持久存储介质(如硬盘)中。

三、Spring事务管理方式

方式一:编程式事务管理:通过注解或XML配置来声明事务的属性,使得开发者无需关注事务管理的具体实现,只需关注业务逻辑。

方式二:声明式事务管理:通过编写代码来进行事务的管理,包括事务的开始、提交、回滚等操作,较为灵活但也增加了开发复杂度

在 Spring 框架中,编程式事务管理很少使用, Spring 的声明式事务管理方式用的较多,这里对声明式事务管理进行详细讲解。

Spring 的声明式事务管理在底层采用了 AOP 技术,其最大的优点在于无须通过编程的方式管理事务,只需要在配置文件中进行相关的规则声明,就可以将事务规则应用到业务逻辑中。

四、Spring事务管理器接口

1.PlatformTransactionManager接口

这个接口是 Spring 事务管理的核心,它定义了事务的边界和生命周期。该接口提供了三个事务操作方法:getTransaction(获取事务状态信息)、commit(提交事务)、rollback(回滚事务)。

2.TransactionDefinition 接口

TransactionDefinition 接口是 Spring 中定义事务属性的接口。它定义了事务的隔离级别、传播行为、超时设置和只读属性等。在 Spring 的事务管理中,通过 TransactionDefinition 接口可以配置事务的各种行为。

该接口的主要方法:

getIsolationLevel(): 获取事务的隔离级别。隔离级别定义了事务之间的可见性,包括未提交的修改对其他事务的可见程度。

getPropagationBehavior(): 获取事务的传播行为。传播行为定义了在一个事务方法被调用时,如何处理已经存在的事务。

getTimeout(): 获取事务的超时时间。超时时间是事务执行的最长时间,如果超过这个时间,事务将被回滚。单位是秒。

isReadOnly(): 判断事务是否是只读的。如果事务是只读的,那么在事务执行期间不允许进行写操作。

getName(): 获取事务的名称。事务的名称可以用于标识事务。

3.TransactionStatus 接口

TransactionStatus 接口是 Spring 中用于表示事务状态的接口。它提供了一些方法,用于检查和管理当前事务的状态,例如提交、回滚、标记为只读等。

该接口的主要方法:

①flush(): 刷新当前事务的状态。这通常用于将事务的状态同步到底层的事务管理器。

②isRollbackOnly():** 检查当前事务是否已经被标记为只读。如果返回 true,表示事务已经被标记为只读,不能再进行写操作。

③hasSavepoint(): 检查当前事务是否有保存点。保存点是事务执行过程中的一个标记,可以在后续的操作中回滚到这个标记。

④isCompleted(): 检查当前事务是否已经完成。如果返回 true,表示事务已经完成,不再处于活动状态。

⑤setRollbackOnly(): 将当前事务标记为只读。一旦事务被标记为只读,后续的操作将只能读取数据,不能进行写操作。这是一个事务状态的修改操作。

五、事务传播行为

1.PROPAGATION_REQUIRED(默认)

表示当前方法必须运行在事务中,如果当前存在事务,则加入该事务;如果没有事务,则创建一个新的事务。这是默认的传播行为,适用于大多数情况。

2.PROPAGATION_REQUIRES_NEW

该选项总是创建一个新的事务。如果当前存在事务,就将当前事务挂起,然后创建一个新的事务。适用于需要独立事务运行的情况。

3.PROPAGATION_SUPPORTS

如果当前存在事务,则加入该事务;如果没有事务,则以非事务的方式执行。适用于不要求事务的情况,但如果有事务就加入。

4.ROPAGATION_NOT_SUPPORTED

表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。如果使用JTATransactionManager的话,则需要访问TransactionManager

5.PROPAGATION_MANDATORY

必须在事务中执行,如果当前没有事务,则抛出异常。适用于需要在事务中执行的情况。

6.PROPAGATION_NEVER

必须以非事务的方式执行,如果当前存在事务,则抛出异常。适用于需要确保没有事务存在的情况。

7.PROPAGATION_NESTED

表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与PROPAGATION_REQUIRED一样。

六、事务隔离性

1.事务隔离级别

*READ UNCOMMITTED(读取未提交数据):这是最低的隔离级别。在一个事务中,可以读取其他事务未提交的数据。这可能导致脏读(读取到未提交的数据),不可重复读(同一事务中两次读取的数据不一致)和幻读(同一范围内两次查询结果集不一致)的问题。

READ COMMITTED(读取已提交数据):就是一个事务要等另一个事务提交之后才能读取数据。这可以解决脏读的问题,但仍可能出现不可重复读和幻读的问题。

REPEATABLE READ(可重复读):重复读就是在事务开启时,不在允许修改操作。这可以解决脏读和不可重复读的问题,但仍可能出现幻读的问题。

SERIALIZABLE(串行化):这是最高的隔离级别。在一个事务中,禁止其他事务插入、修改或删除数据,直到当前事务结束。这可以解决脏读、不可重复读和幻读的问题,但会降低并发性能,因为事务需要按照严格的序列化顺序执行。

2.如果考虑事务隔离会导致三个问题

脏读 :在一个事务中读取到了另外一个事务未提交的事务中的数据,而导致多次读取同一个数据返回的结果不一致。

不可重复读 : 在一个事务中读取到了另外一个事务已提交的数据,而导致多次读取同一个数据返回的结果不一致

幻读(虚读): 幻读是指在一个事务中,同一查询可能返回不同数量的行,因为另一个事务插入了新的数据并提交了。

七、spring事务管理的应用(图书借阅和归还)

1.基于Spring的xml方式

步骤一:在pom.xml文件加入相关依赖

步骤二:创建图书Books实体类

步骤三:创建dao接口和实现类

接口:

实现类BooksDaoImpl

步骤四:创建service接口和实现类

BooksService接口

BooksServiceImpl实现类

步骤五:创建jdbc.properties

步骤六:创建applicationContext.xml配置文件、

步骤七:创建表books

步骤八:测试

2.基于注解的方式

在上面的基础上改变

步骤一:在config包下面创建JdbcConfig

步骤二:创建SpringConfiguration替换applicationContext.xml

步骤三:修改BooksServiceImpl和BooksDaoImpl

步骤四:修改测试类

运行结果如下:

执行前:

执行后:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值