Designing Transaction Strategies
Now it is time to put everything together. In this chapter, we will summarize, and perhaps repeat a few rules that can help us reduce blocking and improve concurrency in a system. The most important rule we need to remember is that most cases of concurrency and blocking can be fixed by query optimization. Even if we do not talk about system performance in general, non-optimized queries scan more data than is needed. From a locking standpoint, this means that those queries issue more lock requests, which increase the chances of collision and blocking with other sessions. This is especially true for queries that change data. While we have some options to deal with shared (S) locks from non-optimized readers, there is very little that we can do with blocking introduced by writers and update (U) locks. SNAPSHOT transaction isolation level is the only option where writers do not block other writers, although switching to that isolation level requires code redesign and introduces major overhead to the server.