As far as I know, double spending is possible. Although it won't get confirmed. Sites that don't require confirmations for deposits will receive the deposit.
You and I are using different definitions for the words "double spending". Before we can discuss whether "double spending" is possible, we must first agree on what the words "double spending" mean.
Spending an input 2 times.
That doesn't mean anything. You've used the word "spending" to describe "double spending".
Here's the definition I'm using:
Creating multiple transactions that each use the exact same output as an input and that are all included in the blockchain.This is "spending an input 2 times", and it is not possible with bitcoin.
Anything else is a "double spending
attempt", that will fail to become an actual double spend. One transaction attempt will make it into a blockchain and therefore become a real transaction actually spending an input, and all other transaction attempts will be deleted and cease to exist.
Even if the 2nd isn't included in the blockchain, if the site accepts 0 confirmations, then it is still credited.
Once the first tx is known to a particular node, the second won't even be relayed. It would simply be rejected/dropped as invalid. A tx whose inputs have already been spent is invalid. Once the first tx is in a block, the site would never know about the transaction to give you credit. This is what was occuring w/ MtGox broken withdraws. MtGox was creating txs involving already spent inputs and thus they got rejected by every single node. Users couldn't even see the tx on the network (either on the wallet or on sites like blockchain.info) because the network is designed to NOT relay double spends.
So once the first tx is known to a node, the second isn't a valid unconfirmed tx, it is simply invalid garbage discarded by the network.
The only way a 0-confirm double spend can occur is
a) attacker makes two txs which use the same input(s) A to the merchant and B back to the attacker.
b) the attacker broadcasts A & B to different parts of the network.
c) the merchant only learns about A and never learns about B
d) the miner who ends up solving the next block learns about B first
e) the merchant doesn't have other nodes looking for tx like B and report it to the merchant.
Still that assumes the A isn't already confirmed in a block. If it is, you can't create a tx which spends an already spent input. Your only option would be to rewrite the blockchain (in essence A never occured according to the blockchain so B isn't a "double spend" as far as the protocol is concerned it is the only spend).
Simple version: Danny is right (he usually is).