Two-phase locking (2PL) is a concurrency control technique that guarantees serializable executions. Under 2PL, transactions must acquire all locks in a growing phase and release locks only in a shrinking phase to ensure serializability. While 2PL guarantees serializability, it does not guarantee recoverability on its own. To ensure recoverability, transactions must hold write locks until commit to avoid cascading aborts. The data manager automatically enforces 2PL by acquiring locks on reads and writes from transactions and only releasing locks after a transaction commits or aborts.