Spring的事物注解,会导致同步锁synchronized失效 大概原因是因为 事物注解的优先级高于synchronized, 同步锁是在 开启事物后执行 会导致其他线程请求时 事物还没有提交读取到的数据也不会是更新后的。
解决办法:在开启事物前 加同步锁,方式有两种。
一种是在Controller方法上 加同步锁, 在Service实现方法上 加事物注解
一种是在Service实现方法里 手动加锁 和 事物控制,下面对这种方法进行说明:
@Service
public class OrderServiceImpl extends BaseServlet implements OrderService {
private static Logger logger = Logger.getLogger(OrderServiceImpl.class);
private Lock orderLock = new ReentrantLock(); // 创建锁
@Resource(name = "transactionManager")
private DataSourceTransactionManager transactionManager; // 初始化事物控制
private DefaultTransactionDefinition def = new DefaultTransactionDefinition();
@Override
public Map<String, Object> userNewOrder(Integer userId, int priceType, Order order, int isFollow) {
Map<String, Object> resultMap = Maps.newHashMap();
orderLock.lock(); // 加锁
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务
TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态
try {
// 相关业务处理---
transactionManager.commit(status); // 事物手动提交
resultMap.put("order", order);
} catch (Exception e) {
logger.error("========[ 新建订单异常 ]:", e);
transactionManager.rollback(status); // 事物手动回滚
return AllStateEnum.resultMap(ERRORREQUEST);
} finally {
orderLock.unlock(); // 释放锁
}
return resultMap;
}
}