Java学习笔记Java 杂谈

Spring 事务管理

2017-12-08  本文已影响27人  PandaXiong

事务的四大特性

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

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("网路不给力");
    }

}

占坑未完成

上一篇下一篇

猜你喜欢

热点阅读