templateLock on a container is inherited by everything inside it, which locks the structure and leaves the text editable.
<!-- wp:columns {"templateLock":"all"} -->
<div class="wp-block-columns">
<!-- wp:column {"width":"60%"} -->
<div class="wp-block-column">
<!-- wp:heading --><h2>Your heading</h2><!-- /wp:heading -->
</div>
<!-- /wp:column -->
</div>
<!-- /wp:columns -->
<!-- "all" — no insert, no move, no remove
"insert" — no insert or remove, but reordering is allowed -->
Locking the structure and leaving the content free is the version that survives; locking everything produces a support request within a fortnight and an argument about who owns the page. The lock is advisory in the sense that it lives in the block markup, so an editor with the code editor open can remove it — it is a guard rail rather than a permission. Documenting why a layout is locked, in the pattern description, prevents most of the requests.