Recently we have seen renewed interest in transactional memory due to the rising complexity in programming parallel machines. Most transactional memory systems, either in hardware or in software, are based on optimistic concurrency control, which is optimized for low-contention workloads but suffers from high rates of aborts under high or even moderate contention. These aborts ultimately degrade the performance of the transaction system below simple two-phase locking based systems. We present adaptive concurrency control, a pessimistic-first concurrency control scheme that starts out as simple two-phase locking but can adaptively switch to an optimistic mode once it detects that contention level is low. We built our system on top of STO, a fast, type-aware software transactional memory framework. We show that adaptive concurrency control can do better than the default STO optimistic concurrency control under moderate to high contention, and doesn’t incur significant overhead while contention is low. We also present interesting findings regarding TicToc, a recently proposed optimistic concurrency control that supports transaction rescheduling at commit time. We show that TicToc’s benefit in performance mainly stems from implementation-induced false conflicts in the benchmarks, and offer some insights on how to mix different concurrency control schemes within the same transaction system to minimize false conflicts and maximize performance.