1.問題原因
在使用spring手工開啓事務的時候沒有提交或者回滾。
TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
Order order = orderService.selectById(id);//使用的mybatisPlus的查詢方法
//SettleAccounts 繼承自Order,SettleAccounts表字段較少
SettleAccounts settleAccounts = selectById(order.getSettleAccountsId());
try {
order.setStatus(1);
settleAccounts .setStatus(1);
updateById(settleAccounts);
orderService.updateById(order );
dataSourceTransactionManager.commit(transactionStatus);
}catch (Exception e){
e.printStackTrace();
dataSourceTransactionManager.rollback(transactionStatus);
return ;
}
return ;
2.解決方法
1.確定是否鎖表
select * from information_schema.innodb_locks;
2.查詢正在鎖的事務
select * from information_schema.innodb_locks;
3.查詢等待鎖的事務
select * from information_schema.innodb_lock_waits;
4.查詢未提交的事務
select * from information_schema.innodb_trx
5.查詢所有的線程
select * from information_schema.PROCESSLIST;
select * from information_schema.innodb_trx
查看沒有提交或者回滾的事務,有的話執行
kill 147141;//這個id是trx_mysql_thread_id
或者直接kill所有的mysql線程
select * from information_schema.PROCESSLIST;
直接kill掉所有查出來的ID
3. 問題原因深究
之所以會出現事務沒有提交或者或者回滾是因爲在事務的try方法之前就出現錯誤,
爲什麼會出現錯誤則是因爲mysqlPlus的繼承問題,在子類只用selectbyId的時候會默認查詢所有的父類字段,這樣會導致錯誤,慎用!!!
4. 結束
記錄於此。
本文爲作者原創,轉載請申請