与各位探讨下Spring事务中的NOT_SUPPORTED

arlen43 2016-05-19 01:31:26
spring事务的传播规则
NOT_SUPPORTED,官方解释是:如果有事务,挂起当前事务,以非事务方式执行;
REQUIRES_NEW,官方解释是:如果有事务,挂起当前事务,新建事务执行;

但是我测试的结果是,两个是一样的效果,上网搜了,估计跟我碰到相同的问题的人应该不多吧,所以也没啥结果,我的代码如下,贴出来大伙看看;

PS:在写帖子过程中仔细对比了输出日志,发现是没有问题的,索性帖子写到一半了,干脆写完发出来供大家参考


@Transactional
@Service
public class TransactionTestBusinessImpl implements ITransactionTestBusiness {

@Resource
private ITransactionTestService transService;

@Resource
private IOrderInfoDao orderDao;

@Override
public void otherServiceCall() {
OrderInfo orderQuery = new OrderInfo();
String orderNumber = "ORD2016051315333433342051714";
orderQuery.setOrderNumber(orderNumber);
List<OrderInfo> orderList = orderDao.selectByIndexes(orderQuery);
if (CollectionUtils.isEmpty(orderList)) {
throw new BusinessException(ErrorCode.VERIFY_ERROR, "订单【"+orderNumber+"】不存在");
}
OrderInfo orderInfo = orderList.get(0);
transService.updateOrderInfo(orderInfo);
}
}

@Service
@Transactional
public class TransactionTestServiceImpl implements ITransactionTestService {

@Resource
private IOrderInfoDao orderDao;

@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void updateOrderInfo(OrderInfo orderInfo) {
orderInfo.setUpdateTime(new Date());
orderDao.updateByPrimaryKeySelective(orderInfo);
orderInfo.setAddTime(new Date());
orderDao.updateByPrimaryKeySelective(orderInfo);
}
}


关键日志如下:
--------------------------------------------- PROPAGATION_REQUIRED 开始 ----------------------------------------------
Creating new transaction with name [com.xx.oss.order.business.impl.TransactionTestBusinessImpl.otherTransServiceCall]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
Acquired Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java] for JDBC transaction
Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java] to manual commit
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@602adfd8]
JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java] will be managed by Spring
ooo Using Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java]
==> Preparing: select * from order_info WHERE order_number = ? and del_flag = 0
==> Parameters: ORD2016051315333433342051714(String)
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@602adfd8]
Returning cached instance of singleton bean 'transactionManager'
Suspending current transaction

-- 进入updateOrderInfo方法
Creating a new SqlSession
-- 这里就是迷惑我的地方,其实这并未创建事务,仅仅是从Spring的TransactionSynchronizationManager中注册一下刚刚新建的资源sqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@825e33]
Fetching JDBC Connection from DataSource
Registering transaction synchronization for JDBC Connection
JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java] will be managed by Spring
ooo Using Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java]
==> Preparing: update order_info SET add_time = ?, update_time = ?, del_flag = ? where id = ?
==> Parameters: 2016-05-19 11:50:54.0(Timestamp), 2016-05-19 12:49:14.134(Timestamp), 0(Byte), 1545(Integer)
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@825e33]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@825e33]
Returning JDBC Connection to DataSource

Resuming suspended transaction after completion of inner transaction
Initiating transaction commit
Committing JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java]
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@602adfd8]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@602adfd8]
Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java] after transaction
Returning JDBC Connection to DataSource
--------------------------------------------- PROPAGATION_REQUIRED 结束 ----------------------------------------------

使用REQUIRES_NEW,关键日志如下:
--------------------------------------------- REQUIRES_NEW开始 ----------------------------------------------
Creating new transaction with name [com.xx.oss.order.business.impl.TransactionTestBusinessImpl.otherTransServiceCall]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
Acquired Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java] for JDBC transaction
Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java] to manual commit
Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@602adfd8]
JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java] will be managed by Spring
ooo Using Connection [jdbc:mysql://127.0.0.1:3306/oss?someparam, UserName=root@localhost, MySQL Connector Java]
==> Preparing: select * from order_info WHERE order_number = ? and del_flag = 0
==> Parameters: ORD2016051315333433342051714(String)
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@602adfd8]
Returning cached instance of singleton bean 'transactionManager'
Suspending current transaction

-- 进入updateOrderInfo方法,在上边的日志中,没有再去获取新链接,直接从当前链接中创建sqlSession的

Acquired Connection [jdbc:mysql://127.0.0.1:3306/oss?somparam, UserName=root@localhost, MySQL Connector Java] for JDBC transaction
Switching JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?somparam, UserName=root@localhost, MySQL Connector Java] to manual commit

Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@741f396c]
JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?somparam, UserName=root@localhost, MySQL Connector Java] will be managed by Spring
ooo Using Connection [jdbc:mysql://127.0.0.1:3306/oss?somparam, UserName=root@localhost, MySQL Connector Java]
==> Preparing: update add_time = ?, update_time = ?, del_flag = ? where id = ?
==> Parameters: 2016-05-19 12:49:53.0(Timestamp), 2016-05-19 13:16:38.693(Timestamp), 0(Byte), 1545(Integer)
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@741f396c]
-- 在上边的日志中,这边直接close sqlSession,并回收数据库连接
Initiating transaction commit
Committing JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/oss?somparam, UserName=root@localhost, MySQL Connector Java]
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@741f396c]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@741f396c]
Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?somparam, UserName=root@localhost, MySQL Connector Java] after transaction
Returning JDBC Connection to DataSource


Resuming suspended transaction after completion of inner transaction
Initiating transaction commit
Committing JDBC transaction on Connection [jdbc:mysql://127.0.0.1:3306/oss?somparam, UserName=root@localhost, MySQL Connector Java]
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@602adfd8]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@602adfd8]
Releasing JDBC Connection [jdbc:mysql://127.0.0.1:3306/oss?somparam, UserName=root@localhost, MySQL Connector Java] after transaction
Returning JDBC Connection to DataSource
--------------------------------------------- REQUIRES_NEW 结束 ----------------------------------------------

造成我判断失误的原因就是日志中的那句“Registering transaction synchronization for SqlSession**”,又因为日志多,没有仔细往下看;最近对Spring的事务做了仔细研究,有啥问题的童鞋也可在这个贴中交流交流,我们共同进步

PS:干活了,就酱,大家凑合看看,第一次在论坛发帖,随便邀请了大神讨论,见谅
...全文
781 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧