diff --git a/src/transaction/concurrency/lock_manager.cpp b/src/transaction/concurrency/lock_manager.cpp
index 615e16af289d7a5068c15c3e05f23798db423c85..afd97922cc38b8b04a3871b23d03463c0209ed02 100644
--- a/src/transaction/concurrency/lock_manager.cpp
+++ b/src/transaction/concurrency/lock_manager.cpp
@@ -281,7 +281,9 @@ bool LockManager::unlock(Transaction* txn, LockDataId lock_data_id) {
       [&](const LockRequest& lock_request) { return lock_request.txn_id_ == txn->get_transaction_id(); });
 
   if (lock_request_queue.request_queue_.empty()) {
-    lock_request_queue.group_lock_mode_ = GroupLockMode::NON_LOCK;
+    // lock_request_queue.group_lock_mode_ = GroupLockMode::NON_LOCK;
+    lock_table_.erase(lock_data_id);
+    return true;
   }
 
   bool has_is = false;
diff --git a/src/transaction/transaction_manager.cpp b/src/transaction/transaction_manager.cpp
index 4b55c6e6f8aa1802046c6bd9cc226209192acb2a..aac01a94542602af01ab41e45255e0abbdff93f1 100644
--- a/src/transaction/transaction_manager.cpp
+++ b/src/transaction/transaction_manager.cpp
@@ -8,6 +8,7 @@ EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 See the Mulan PSL v2 for more details. */
 
+#include <malloc.h>
 #include <cassert>
 
 #include "record/rm_file_handle.h"
@@ -136,12 +137,14 @@ void TransactionManager::commit(Transaction* txn, LogManager* log_manager) {
   }
   txn->get_write_set()->clear();
 
-  txn->get_write_set() = nullptr;
-  txn->get_lock_set() = nullptr;
-  txn->get_index_latch_page_set() = nullptr;
-  txn->get_index_deleted_page_set() = nullptr;
+  txn->get_write_set().reset();
+  txn->get_lock_set().reset();
+  txn->get_index_latch_page_set().reset();
+  txn->get_index_deleted_page_set().reset();
 
   txn->set_state(TransactionState::COMMITTED);
+
+  malloc_trim(0);
 }
 
 /**
@@ -258,6 +261,8 @@ void TransactionManager::abort(Transaction* txn, LogManager* log_manager) {
   txn->get_index_deleted_page_set() = nullptr;
 
   txn->set_state(TransactionState::ABORTED);
+
+  malloc_trim(0);
 }
 
 void TransactionManager::reset_index(Transaction* txn, WType type, std::string& tab_name, Rid rid, char* old_data,