How does Radix prevent double-spending?

Radix uses logical clocks for generating a causal ordering of events to detect and prevent double spends.

Essentially the first event to gain a temporal proof will become the valid event, the second event will be automatically discarded by the nodes as soon as the earlier temporal proof is presented. In the event that two temporal proofs happen exactly simultaneously (regardless of whether you submitted them simultaneously) both transactions will be dropped. As this will happen within the time it takes for both transactions to be gossiped to all Nodes in a shard, certainty of a transaction can be generally reached within 5 seconds or less.