They must ensure that no data that requires coordinated changes is modified outside an STM transaction.
How does Clojure handle this? In Haskell, the type system ensures that STM operations can only happen where expected. (Reading a TMVar, for example, returns something of type STM (TMVar a). This means that the enclosing function must also return something of the type STM a. To get the actual data out, you run the transaction, which is of type STM a -> IO a. The type system automatically ensures that STM operations don't happen anywhere else.)
Keep in mind Clojure is running on top of jvm so they had to, first, figure out a balance between being practical and being "pretty" and, second, work within the constraints of the environment. I think Rich Hickey has done a tremendous job here (and keeps doing it).
How does Clojure handle this? In Haskell, the type system ensures that STM operations can only happen where expected. (Reading a TMVar, for example, returns something of type STM (TMVar a). This means that the enclosing function must also return something of the type STM a. To get the actual data out, you run the transaction, which is of type STM a -> IO a. The type system automatically ensures that STM operations don't happen anywhere else.)