Spring——事物注解与synchronized冲突问题

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;
    }
}

 

转载于:https://my.oschina.net/danjuan/blog/1628274

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值