user89573: This link mentions that 
"[getdata] can be used to retrieve transactions, but only if they are in the memory pool or relay set - arbitrary access to transactions in the chain is not allowed..."
But can't an SPV node do the following to have the arbitrary access to a transaction T (I am assuming that the SPV node knows the block hash H of the block B containing T):

set a bloom filter using filterload for T at some full node
send getdata request with type MSG_FILTERED_BLOCK and block hash H
then in response, the full node will generate two messages for the SPV node: first, a merkleblock of B; and second, the transaction T (as mentioned here and here)

Doesn't this mechanism actually gives arbitrary access to transactions?

user90088: That is based on the minimum indexing required to run a full-node.
A getdata msg to peers can only request TX resources in mempool (valid, unconfirmed). Not all full-nodes index confirmed transactions. UTXO and mempool tx are necessarily indexed for validation and tx propagation/block template creation respectively. 
Confirmed transaction are supplied as part of getdata request with blockhashes. Blocks are indexed by all full-nodes. (Since new block-headers must reference previous headers, even if they are branch-extending, vs strong-chain extending)
Correction(see comment below): 

89573: <p><a href="https://en.bitcoin.it/wiki/Protocol_documentation#getdata" rel="nofollow noreferrer">This</a> link mentions that </p>

<p>"[<em>getdata</em>] can be used to retrieve transactions, but only if they are in the memory pool or relay set - arbitrary access to transactions in the chain is not allowed..."</p>

<p>But can't an SPV node do the following to have the arbitrary access to a transaction T (I am assuming that the SPV node knows the block hash H of the block B containing T):</p>

<ol>
<li>set a bloom filter using <em>filterload</em> for T at some full node</li>
<li>send <em>getdata</em> request with type MSG_FILTERED_BLOCK and block hash H</li>
<li>then in response, the full node will generate two messages for the SPV node: first, a merkleblock of B; and second, the transaction T (as mentioned <a href="https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki" rel="nofollow noreferrer">here</a> and <a href="https://bitcoin.stackexchange.com/questions/11054/how-do-spv-simple-payment-verification-wallets-learn-about-incoming-transactio">here</a>)</li>
</ol>

<p>Doesn't this mechanism actually gives arbitrary access to transactions?</p>
 90088: <p><strong>That is based on the minimum indexing required to run a full-node.</strong></p>

<p>A getdata msg to peers can only request TX resources in mempool (valid, unconfirmed). Not all full-nodes index confirmed transactions. UTXO and mempool tx are necessarily indexed for validation and tx propagation/block template creation respectively. </p>

<p>Confirmed transaction are supplied as part of getdata request with blockhashes. Blocks are indexed by all full-nodes. (Since new block-headers must reference previous headers, even if they are branch-extending, vs strong-chain extending)</p>

<p><strong>Correction(see comment below):</strong> </p>
