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("网路不给力");
}
}
占坑未完成