Is there a way to make content read only?

Yes, transaction is stoped if you throw an error.

Note: updated_by is not available in delete lifecycles, so you can apply that logic only for updates.