现象 日志里提示了如下一个错误: Transaction rolled back because it has been marked as rollback 意思是,准备提交事务,将落地的数据库数据生效时,事务已经被设置为rollback-only了,无法提交事务。后面仔细看了一下代码,原来是开了事务的方法里,抛了一个异常,但是程序把这个异常给catch住了,没往上抛。
但是在A方法又catch到B方法抛的异常,但是A方法catch到异常后没有继续往上抛出,而是继续执行后面的代码,最后正常提交事务,那么就会抛出 Transaction rolled back because it has been marked as rollback-only这异常!(因为AB是用同一个事务,在B方法执行的时候这个事务就标记为rollback-only,然后A方法继续使用该事务,然后又执行事务提交的操作,所以最后会抛异常)
<selectid="getByParam"resultMap="CrowdManageResult"parameterType="java.util.Map"> select <includerefid="Base_Column_List"/> from t_crowd_manage where 1=1 <iftest="crowd.name != null"> and name like concat('%',#{crowd.name, jdbcType=VARCHAR},'%') </if> <iftest="crowd.type != null"> and type = #{crowd.type, jdbcType=INTEGER} </if> <iftest="crowd.status != null"> and status = #{crowd.status, jdbcType=INTEGER} </if> <iftest="crowd.noStatus != null"> and status != #{crowd.noStatus, jdbcType=INTEGER} </if> <iftest="ids != null and ids.size() > 0"> and id in <foreachitem="id"collection="ids"open="("separator=","close=")"> #{id, jdbcType=BIGINT} </foreach> </if> order by update_time desc </select>