1. Транзакции-то в БД оно понятно, что нужны. Но нужны ещё и программные локи при начале обработки. То есть начали процедуру оплаты - пишем в таблицу локов [lock_id, time_stamp] что-то вроде [order_23423563720234, 2014-08-22 12:21:05]. Закончили - удалили запись из таблицы локов. Так вы избежите задвоений в случае каких-то ошибок при обработке транзакций. + читайте далее.
2. Как вы уже поняли, нужна не только табличка операционных транзакций, но ещё и ордеров, к которым относятся транзакции. Соответственно, локи на ордеры жизненно необходимы, чтобы в один момент времени над конкретным ордером совершалась только 1 транзакция. Почему нужна такая связь один-ко-многим? Ну допустим возникнет ситуация опротестования транзакции. Как вы будете аннулировать заказ? Нужно делать транзакцию на реверс/рефанд, чтобы сохранить историю операций.
А на счёт double-spending не в курсе