Spring 事务管理

作者: PandaXiong | 来源:发表于2017-12-08 17:50 被阅读27次

    事务的四大特性

    原子性:事物是最小执行单位,不可分割。
    隔离性:事物间不能相互打扰,是否可以理解为多个事物不能同时对……进行操作
    一致性:事务前后数据的完整性必须保持一致
    持久性:事务一旦被提交,修改的就是永久的

    Spring事务接口

    事务接口

    隔离性控制会出现的问题:
    脏读:一个事务读取了另一个事务改写但未提交的数据。如果这些数据被回滚,则读到的数据是无效的。
    不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同(其他事务提交更改)
    幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。

    事务的隔离级别:

    隔离级别

    事务的传播行为:

    解决业务层方法间的相互调用,


    事务传播行为

    Spring事务管理的实现

    spring将事务管理分成了两类:
    -编程式事务管理:
    *手动编写代码进行事物管理。(很少使用)
    -声明式事务管理:
    *基于TransactionProxyFactoryBean的方式。需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强(很少使用)
    *基于AspectJ的XML方式。一旦配置好,类上不需要添加任何东西。
    *基于注解方式。配置简单,需要在业务层上天海@Transactional的注解

    基于注解方式的事务管理

    @Transactional(可以配置参数)

    @Transactional()//isolation = Isolation.SERIALIZABLE
    public void transfer(String fromUuid, String toUUid, BigDecimal amount) {
    
        BigDecimal fromAmount = mapper.getUserAmount(fromUuid);
        BigDecimal toAmount = mapper.getUserAmount(toUUid);
    
        if (fromAmount.compareTo(amount) == -1) {
            throw new ValidationException("金额不足!");
        }
    
        fromAmount = fromAmount.subtract(amount);
        toAmount = toAmount.add(amount);
    
        int result = mapper.updateUserAmount(fromUuid, fromAmount);
        int result2 = mapper.updateUserAmount("", toAmount);
        if (result != 1 || result2 != 1) {
            //抛出异常,事务回滚
            throw new ValidationException("网路不给力");
        }
    
    }
    

    占坑未完成

    相关文章

      网友评论

        本文标题:Spring 事务管理

        本文链接:https://www.haomeiwen.com/subject/vlfyixtx.html