Locks are used to protect logical data integrity and are often held for the duration of a transaction. Latches synchronize access to internal server structures like buffer pages in cache and I/O operations. Spinlocks are lightweight locks that protect internal data structures and cause threads to "spin" rather than sleep during contention. All three concurrency structures are used for synchronization but differ in how they operate and the level and duration of the resources they protect.