Spring——事物註解與synchronized衝突問題

Spring的事物註解,會致使同步鎖synchronized失效 大概緣由是由於 事物註解的優先級高於synchronized, 同步鎖是在 開啓事物後執行 會致使其餘線程請求時 事物尚未提交讀取到的數據也不會是更新後的。java

解決辦法:在開啓事物前 加同步鎖,方式有兩種。ide

一種是在Controller方法上 加同步鎖, 在Service實現方法上 加事物註解線程

一種是在Service實現方法裏 手動加鎖 和 事物控制,下面對這種方法進行說明:code

 

@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;
    }
}
相關文章
相關標籤/搜索