Spring声明式事务@Transactional的使用陷阱
在Spring的声明式事务使用过程中,是否遇到过@Transactional不起作用的情况?请看代码:
@Transactional(propagation=Propagation.REQUIRED) public TradeData placeTrade(TradeData trade){ try { insertTrade(trade); //方法1updateAcct(trade); //方法2return trade; } catch (SQLException ex) { //log the error throw ex; }}上述代码中,@Transactional会起到织入事务管理的作用吗?
答案是否。
原因是:运行时异常(未捕获的异常)会强迫整个事务逻辑单元回滚,但是被捕获的异常则不会。
所以,要想让@Transactional起作用,则需在实际逻辑处理中,把遇到的异常抛出。上面的例子可以这么写:
@Transactional(propagation=Propagation.REQUIRED) public TradeData placeTrade(TradeData trade) throws SQLException{ insertTrade(trade); //方法1updateAcct(trade); //方法2return trade; }