Unless you have a situation where some of the problems you've described are a failure of a current app, and the project is explicitly to address those issues, I think you risk over-engineering the situation. There isn't anything you've described that isn't a potential for every other app, java-based or otherwise.
It is important to realize that for 99% of web/enterprise apps the fundamental objective is to be transactionally safe when you change the data. It doesn't matter if the database state changed at some point, only that from a relational standpoint the state reflects whole changes, not wierd fractional mixes of changes. You can't guarantee data hasn't changed, and most of the time you shouldn't even try. The most you usually need to do is identify particular fields or tables that are problematic and check them.
Example: you have a table of product data. That product has a description, and a price. You have a customer who uses a webapp to buy the product. You have an administrator who maintains the list of products and the price and description for each product on the list. You have a business policy that the description can only be changed by the administrator to fix errors, not to mutate a row from describing one product into some other product.
Given a situation like that, about the only version consistency issue you might have is to make sure that the price a customer used when submitting an order is the same as the price currently in the database. If the administrator changed the price, and the customer had a web page from before until after that change, clearly rejecting the order would make sense. The only consistency check would be to look at the price from the HTTP submit and compare it to the current state in the database. You wouldn't even need VC for something like this, you could even make the old price part of the SQL query for finding the entity to act on (select id from foo where id=1 and price=17.00); if the entity isn't found, data changed in a way you know you have to react to.
I'd suggest going through an exercise like that with the *real* situations your product is supposed to deal with, not ones I might make up or you might hypothesize. It could be the difference between a project taking weeks/months versus a project taking years.
And as a side note, except in limited situations, DTOs are not going to improve this situation, as I think you've already noticed. CMP beans will have select-for-update locks unless you've configured them differently, and that reduces some of the concerns you've raised (not the web user delays, just in the back-end processing). DTO is an old idiom that was understandable during EJB 1.0, but has hung around longer than really makes sense, at least for full-blown EJB applications. I think of it as the Statement (versus PreparedStatement) of EJB. It tends to shove people into a design process based on layers instead of modelling code based on appropriately organized behaviours or responsibilities. Layered isn't necessarily bad, but often such code exhibits rigidity, a common problem recognized long before
Java was even on the scene. EJB 1.0 weaknesses (and a lot of publications) headed people in that direction, and DTO popped out as one of the many survival techniques. It has its place, but not really in current EJB code. No doubt a few people will come crawling out of the woodwork on that point, but c'est la vie.