事务

  • 事务的四大特性(ACID)

    • 原子性:一个事务要么全部执行,要么不执行,也就是说一个事务不可能只执行了一半就停止了。

      经典的例子:比如你从取款机取钱,这个事务可以分成两个步骤

      1、插卡,2、出钱。不可能插了卡,而钱却没出来。这两步必须同时完成,要么就不完成。

    • 一致性:事务的运行并不改变数据库中数据的一致性。

    • 隔离性:数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

    • 持久性:事务执行成功以后,该事务对数据库所作的更改是持久的保存在数据库中

  • 事务在项目开发过程中,十分重要,涉及数据的一致性问题,不能马虎

  • 确保完整性和一致性

Spring中的事务管理

  • 编程式事务管理
    • 将事务管理代码嵌到业务方法中来控制事务的提交和回滚
    • 缺点:必须在每个事务操作业务逻辑中包含额外的事务管理代码
  • 声明式事务管理
    • 一般情况下比编程式事务好用。
    • 将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。
    • 将事务管理作为横切关注点,通过aop方法模块化。Spring中通过Spring AOP框架支持声明式事务管理。

JDBC事务

1
2
3
4
5
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>

配置好事务管理器后我们需要去配置事务的通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!--结合AOP实现事务的织入-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--给那些方法配置事务-->
<!--配置事务的传播特性:propagation(默认REQUIRED)-->
<tx:attributes>
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="query" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<!--配置事务切入-->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* cn.imzjw.mapper.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>

为什么需要事务?

  • 如果不配置事务,可能存在数据提交不一致的情况下
  • 如果我们不在Spring中去配置声明式事务,那么就需要在代码中手动配置事务,但我还是喜欢声明式事务