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:干活了,就酱,大家凑合看看,第一次在论坛发帖,随便邀请了大神讨论,见谅