mysql事務未提交導致MySQLTransactionRollbackException: Lock wait timeout

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. 結束

記錄於此。
本文爲作者原創,轉載請申請

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章