diff --git a/src/context/pool_query_context.c b/src/context/pool_query_context.c
index 83c0a2b2..ebc5c1d4 100644
--- a/src/context/pool_query_context.c
+++ b/src/context/pool_query_context.c
@@ -802,6 +802,7 @@ pool_send_and_wait(POOL_QUERY_CONTEXT * query_context,
 	POOL_CONNECTION *frontend;
 	POOL_CONNECTION_POOL *backend;
 	bool		is_commit;
+	bool		is_savepoint;
 	bool		is_begin_read_write;
 	int			i;
 	int			len;
@@ -811,6 +812,7 @@ pool_send_and_wait(POOL_QUERY_CONTEXT * query_context,
 	frontend = session_context->frontend;
 	backend = session_context->backend;
 	is_commit = is_commit_or_rollback_query(query_context->parse_tree);
+	is_savepoint = is_savepoint_query(query_context->parse_tree);
 	is_begin_read_write = false;
 	len = 0;
 	string = NULL;
@@ -851,9 +853,12 @@ pool_send_and_wait(POOL_QUERY_CONTEXT * query_context,
 
 		/*
 		 * If we are in streaming replication mode or logical replication mode,
-		 * we do not send COMMIT/ABORT to standbys if it's in I (idle) state.
+		 * we do not send COMMIT/ABORT/SAVEPOINT etc. to standbys if it's in I (idle) state.
+		 * This could happen when a multi-statement query includes INSERT/UPDATE. Because
+		 * the multi-statement is transformed into a single-statement query by the minimal-parser and
+		 * Pgpool-II does not recognize a transaction is started by a multi-statement query.
 		 */
-		if (is_commit && MAIN_REPLICA && !IS_MAIN_NODE_ID(i) && TSTATE(backend, i) == 'I')
+		if ((is_commit || is_savepoint) && MAIN_REPLICA && !IS_MAIN_NODE_ID(i) && TSTATE(backend, i) == 'I')
 		{
 			pool_unset_node_to_be_sent(query_context, i);
 			continue;
@@ -952,6 +957,7 @@ pool_extended_send_and_wait(POOL_QUERY_CONTEXT * query_context,
 	POOL_CONNECTION *frontend;
 	POOL_CONNECTION_POOL *backend;
 	bool		is_commit;
+	bool		is_savepoint;
 	bool		is_begin_read_write;
 	int			i;
 	int			str_len;
@@ -963,6 +969,7 @@ pool_extended_send_and_wait(POOL_QUERY_CONTEXT * query_context,
 	frontend = session_context->frontend;
 	backend = session_context->backend;
 	is_commit = is_commit_or_rollback_query(query_context->parse_tree);
+	is_savepoint = is_savepoint_query(query_context->parse_tree);
 	is_begin_read_write = false;
 	str_len = 0;
 	rewritten_len = 0;
@@ -1000,10 +1007,13 @@ pool_extended_send_and_wait(POOL_QUERY_CONTEXT * query_context,
 			continue;
 
 		/*
-		 * If in reset context, we send COMMIT/ABORT to nodes those are not in
-		 * I(idle) state.  This will ensure that transactions are closed.
+		 * If we are in streaming replication mode or logical replication mode,
+		 * we do not send COMMIT/ABORT/SAVEPOINT etc. to standbys if it's in I (idle) state.
+		 * This could happen when a multi-statement query includes INSERT/UPDATE. Because
+		 * the multi-statement is transformed into a single-statement query by the minimal-parser and
+		 * Pgpool-II does not recognize a transaction is started by a multi-statement query.
 		 */
-		if (is_commit && session_context->reset_context && TSTATE(backend, i) == 'I')
+		if ((is_commit || is_savepoint) && MAIN_REPLICA && !IS_MAIN_NODE_ID(i) && TSTATE(backend, i) == 'I')
 		{
 			pool_unset_node_to_be_sent(query_context, i);
 			continue;
