Spring学习笔记——第十二部分 事务(完结撒花)

  • 把一组业务当成一个业务来做:要么都成功,要么都失败。
  • 确保完整性和一致性。
  • 事务十分重要。

1. AICD原则

  • 原子性(Atomicity):一个事务要么全部执行,要么不执行。即一个事务不可能只执行了一半就停止了。
    比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱。
    不可能划了卡,而钱却没出来。这两步必须同时完成,要么就不完成。
  • 一致性(Consistency):是指事务的运行并不改变数据库中数据的一致性。
    例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。
  • 独立性(Isolation):事务的独立性也称作隔离性,是指两个以上的事务不会出现交错执行的状态。
    因为这样可能会导致数据不一致,更加具体的来讲,就是事务之间的操作是独立的。
  • 持久性(Durability):事务的持久性是指事务执行成功以后,该事务对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚。

MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理。
一旦配置好了 Spring 的事务管理器,你就可以在 Spring 中按你平时的方式来配置事务。

2. Spring中的事务管理(声明式事务)

  • 声明式事务:AOP
  • 编程式事务:需要在代码中进行事务管理

2.1 Spring中七种propagation类的事务属性详解

在这里插入图片描述

2.2 spring-dao.xml

<!--配置声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <constructor-arg ref="dataSource" />
</bean>

<!--结合AOP实现事务管理-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>
<!--配置事务切入-->
<aop:config>
    <aop:pointcut id="txPointCut" expression="execution(* com.zhang.mapper.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>

2.3 UserMapperImpl.java

public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{


    public List<User> selectUser() {
        return getSqlSession().getMapper(UserMapper.class).selectUser();
    }

    public int addUser(User user) {
        return getSqlSession().getMapper(UserMapper.class).addUser(user);
    }

    public int deleteUser(int id) {
        return getSqlSession().getMapper(UserMapper.class).deleteUser(id);
    }

}

2.4 测试类

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserMapper userMapper = context.getBean("userMapper", UserMapper.class);
    User user = new User(5, "小王", "32132132");
    userMapper.addUser(user);
    userMapper.deleteUser(5);

}

2.5 UserMapper.xml

<delete id="deleteUser" parameterType="int">
    deletee from mybatis.user where id=#{id}
</delete>
  • 很明显上面的语句错把delete写成了deletee,我们希望在运行时要么都成功,要么都失败。
  • 当不配置2.2的语句时,会报出错误,但依然会执行addUser,而不执行deleteUser。
  • 此时配置事务,依然会报错,但是数据库中的数据没有改变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值