SlideShare a Scribd company logo
Session
SAD335

  Concurrency problems and
  locking techniques in SQL
   Server 2000 and VB.NET
          Fernando G. Guerrero
                SQL Server MVP
              .NET Technical Lead
                    QA plc

                 October 2002
Quick info about Fernando
                            (2 milliseconds)

                            •   MCSD, MCSE+Internet (W2K), MCDBA, MCT,




QA
                                SQL Server MVP

                            •   This is where I work: QA, The best learning
                                environment in Europe

                            •   Writing for SQL Sever Magazine and SQL
                                Server Professional

                            •   This is my main web site: www.callsql.com

                            •   This is my book (so far):
                                 –   Microsoft SQL Server 2000 Programming by
                                     Example (ISBN : 0789724499, co-authored with Carlos
                                     Eduardo Rojas)


                            •   Currently writing on ADO.NET and SQL Server
                                2000


SQL Server Magazine LIVE!
Agenda
•   Concurrency problems
•   Isolation levels
•   Locks
•   Transactions




SQL Server Magazine LIVE!            3
Concurrency problems
•   Lost Updates
•   Uncommitted Dependency
•   Inconsistent Analysis
•   Phantom Reads




SQL Server Magazine LIVE!        4
Lost Updates (1)
                          Peter            Paul
Peter              UnitPric         UnitPric
                                                  Paul
                   e                e
                   10.0             10.0




 SQL Server Magazine LIVE!
                                 Mary
                                                    5
                              (SQL Server)
Lost Updates (2)
                          Peter              Paul
Peter              UnitPric   @UP *   UnitPric
                                                    Paul
                   e          1.2     e
                   10.0       12.0    10.0
DECLARE @UP money

SELECT @UP = UnitPrice
FROM Products
WHERE ProductID = 25




 SQL Server Magazine LIVE!
                                 Mary
                                                      6
                              (SQL Server)
Lost Updates (3)
                                Peter             Paul
Peter                    UnitPric   @UP *   UnitPric   @UP *
                                                               Paul
                         e          1.2     e          1.1
                         10.0       12.0     10.0 11.0
DECLARE @UP money
                                            DECLARE @UP money
SELECT @UP = UnitPrice
FROM Products
WHERE ProductID = 25
                                            SELECT @UP = UnitPrice
                                            FROM Products
                                            WHERE ProductID = 25




   SQL Server Magazine LIVE!
                                       Mary
                                                                 7
                                    (SQL Server)
Lost Updates (4)
                                Peter              Paul
 Peter                   UnitPric   @UP *   UnitPric   @UP *
                                                                            Paul
                         e          1.2     e          1.1

DECLARE @UP money        12.0       12.0    12.0       11.0    DECLARE @UP money
SELECT @UP = UnitPrice                                         SELECT @UP = UnitPrice
FROM Products                                                  FROM Products
WHERE ProductID = 25                                           WHERE ProductID = 25


UPDATE Products
SET UnitPrice =
    @UP * 1.2
WHERE ProductID = 25


   SQL Server Magazine LIVE!
                                       Mary
                                                                                   8
                                    (SQL Server)
Lost Updates (5)
                                   Peter              Paul
 Peter                      UnitPric   @UP *   UnitPric   @UP *
                                                                              Paul
                            e          1.2     e          1.1

DECLARE @UP money           11.0       12.0    11.0       11.0    DECLARE @UP money
SELECT @UP = UnitPrice                                            SELECT @UP = UnitPrice
FROM Products                                                     FROM Products
WHERE ProductID = 25                                              WHERE ProductID = 25
UPDATE Products
SET UnitPrice = @UP * 1.2
WHERE ProductID = 25                             UPDATE Products
                                                 SET UnitPrice =
                                                     @UP * 1.1
                                                 WHERE ProductID = 25


   SQL Server Magazine LIVE!
                                          Mary
                                                                                 9
                                       (SQL Server)
Uncommitted Dependency (1)
                          Peter            Paul
Peter              UnitPric         UnitPric
                                                  Paul
                   e                e
                   10.0             10.0




 SQL Server Magazine LIVE!
                                 Mary
                                                    10
                              (SQL Server)
Uncommitted Dependency (2)
                          Peter            Paul
Peter              UnitPric         UnitPric
                                                  Paul
                   e                e
                   12.0             12.0
BEGIN TRANSACTION

UPDATE PRODUCTS
SET UnitPrice =
    UnitPrice * 1.2
WHERE ProductID = 25



 SQL Server Magazine LIVE!
                                 Mary
                                                    11
                              (SQL Server)
Uncommitted Dependency (3)
                                  Peter           Paul
 Peter                     UnitPric         UnitPric   @UP
                                                             Paul
                           e                e
                           12.0             12.0 12.0
BEGIN TRANSACTION
                                           DECLARE @UP money
UPDATE PRODUCTS
SET UnitPrice = UnitPrice * 1.2
WHERE ProductID = 25
                                           SELECT @UP = UnitPrice
                                           FROM Products (NOLOCK)
                                           WHERE ProductID = 25




   SQL Server Magazine LIVE!
                                         Mary
                                                               12
                                      (SQL Server)
Uncommitted Dependency (4)
                                  Peter            Paul
 Peter                     UnitPric         UnitPric   @UP
                                                                           Paul
                           e                e

BEGIN TRANSACTION          12.0
                           10.0             12.0
                                            10.0       12.0   DECLARE @UP money
UPDATE PRODUCTS                                               SELECT @UP = UnitPrice
SET UnitPrice = UnitPrice * 1.2                               FROM Products
WHERE ProductID = 25                                          WHERE ProductID = 25


ROLLBACK TRANSACTION




   SQL Server Magazine LIVE!
                                         Mary
                                                                                  13
                                      (SQL Server)
Uncommitted Dependency (5)
                                  Peter            Paul
 Peter                     UnitPric         UnitPric   @UP
                                                                            Paul
                           e                e

BEGIN TRANSACTION          10.0             10.0       12.0     DECLARE @UP money
UPDATE PRODUCTS                                                 SELECT @UP = UnitPrice
SET UnitPrice = UnitPrice * 1.2                                 FROM Products
WHERE ProductID = 25                                            WHERE ProductID = 25
ROLLBACK TRANSACTION
                                                   INSERT [Order details]
                                                   (
                                                         OrderID,
                                                         ProductID,
                                                         UnitPrice,
                                                         Quantity,
                                                         Discount)
                                                   VALUES (25365, 25,
   SQL Server Magazine LIVE!
                                         Mary                @UP,   10, 0.1)
                                                                           14
                                      (SQL Server)
Inconsistent Analysis (1)
                               Peter
Peter                                       Paul




 SQL Server Magazine LIVE!
                                Mary
                                              15
                             (SQL Server)
Inconsistent Analysis (2)
                            Peter
  Peter          @Count             830   Paul
                 @Total
                 @Average
                 @Total /
DECLARE @Count   int,
                 @Count

    @Total money,
    @Average money

SELECT @Count =
     COUNT(DISTINCT
              OrderID)
FROM [Order Details] Mary
   SQL Server Magazine LIVE!                16
                      (SQL Server)
Inconsistent Analysis (3)
                                        Peter
 Peter                       @Count             830        Paul
                             @Total
DECLARE @Count int,
   @Total money,             @Average
   @Average money
SELECT @Count =              @Total /
   COUNT(DISTINCT OrderID)   @Count
FROM [Order Details]
                                            UPDATE [Order details
                                            SET Quantity = 600
                                            WHERE OrderID = 10272
                                            AND ProductID = 20



   SQL Server Magazine LIVE!
                                     Mary
                                                             17
                                  (SQL Server)
Inconsistent Analysis (4)
                                        Peter
 Peter                       @Count             830                      Paul
                             @Total             1304284.2
DECLARE @Count int,                             4           UPDATE [Order details]
   @Total money,                                            SET Quantity = 600
   @Average money            @Average                       WHERE OrderID = 10272
SELECT @Count =                                             AND ProductID = 20
   COUNT(DISTINCT OrderID)   @Total /           1571.43
FROM [Order Details]
                             @Count
SELECT @Total =
   SUM(UnitPrice *
      Quantity *
      (1 – Discount))
FROM [Order Details]

   SQL Server Magazine LIVE!
                                     Mary
                                                                             18
                                  (SQL Server)
Inconsistent Analysis (5)
                                        Peter
 Peter                       @Count             830                     Paul
                             @Total             1304284.2
DECLARE @Count int,                             4           UPDATE [Order details]
   @Total money,                                            SET Quantity = 600
   @Average money            @Average                       WHERE OrderID = 10272
SELECT @Count =                                             AND ProductID = 20
   COUNT(DISTINCT OrderID)   @Total /           1571.43
FROM [Order Details]
                             @Count
SELECT @Total =
   SUM(UnitPrice *
      Quantity *
      (1 – Discount))
FROM [Order Details]                        UPDATE [Order
                                            details]
                                            SET Discount = 0.4
                                            WHERE ProductID =
   SQL Server Magazine LIVE!
                                        Mary20
                                                                           19
                                  (SQL Server)
Inconsistent Analysis (6)
                                         Peter
  Peter                       @Count             830                     Paul
                              @Total             1304284.2
 DECLARE @Count int,                             4           UPDATE [Order details]
    @Total money,                                            SET Quantity = 600
    @Average money            @Average           1542.78     WHERE OrderID = 10272
 SELECT @Count =                                             AND ProductID = 20
    COUNT(DISTINCT OrderID)   @Total /           1571.43
 FROM [Order Details]
                              @Count                         UPDATE [Order details]
                                                             SET Discount = 0.4
 SELECT @Total =                                             WHERE ProductID = 20
    SUM(UnitPrice *
       Quantity *
       (1 – Discount))
 FROM [Order Details]



SELECT @Average =
   AVG(TotalPrice)
FROM (…) AS TotOrders
    SQL Server Magazine LIVE!
                                      Mary
                                                                            20
                                   (SQL Server)
Phantom Reads (1)
                   OrderID ProductI UnitPrice
 Peter                     D                    Paul
                   10259      37      20.8
                   10337      37      20.8
                   10408      37      20.8
                   10523      37      26.0
                   10847      37      26.0
                   10966      37      26.0


SELECT OrderID,
   ProductID,
   UnitPrice
FROM [Order Details]
WHERE ProductID = 37
  SQL Server Magazine LIVE!
                                 Mary
                                                  21
                              (SQL Server)
Phantom Reads (2)
                        OrderID ProductI UnitPrice
Peter                           D                         Paul
                        10259   37       20.80
                        10337   37       20.80
SELECT OrderID,
   ProductID,           10408   37       20.80
   UnitPrice
FROM [Order Details]    10523   37       26.00
WHERE ProductID = 37
                        10847   37       26.00
                        10966   37       26.00
                        10615   37
                                       INSERT [Order
                                        31.54


                                       details]
                                             (OrderID,
                                       ProductID,
                                             UnitPrice,
                                   MaryQuantity,
                                (SQL Server) Discount)
   SQL Server Magazine LIVE!                                22
Phantom Reads (3)
                        OrderID ProductI UnitPrice
 Peter                          D                                Paul
                        10259   37       20.80
                        10337   37       20.80
SELECT OrderID,                                      INSERT [Order details]
   ProductID,           10408   37       20.80          (OrderID, ProductID,
   UnitPrice                                            UnitPrice, Quantity,
FROM [Order Details]    10523   37       26.00
                                                        Discount)
WHERE ProductID = 37
                        10847   37       26.00       VALUES (10615, 37,
                                                        31.54, 20, 0.1)
                        10966   37       26.00
                        10615   37       31.54
SELECT OrderID,
   ProductID,
   UnitPrice
FROM [Order Details]
WHERE ProductID = 37
   SQL Server Magazine LIVE!
                                   Mary
                                                                    23
                                (SQL Server)
Isolation levels
• Transact-SQL:
   – READ COMMITTED
   – READ UNCOMMITTED
   – REPEATABLE READ
   – SERIALIZABLE
• Extra .NET Isolation Levels:
   – Chaos (not valid for SQLClient)
   – Unspecified (not settable for SQLClient)

SQL Server Magazine LIVE!                       24
Isolation levels vs. Concurrency
             problems
            P   Problem
                                             Isolation
            S   Solution
                                               Level
            X




                                                                                  SERIALIZABLE
                solved by standard




                                           UNCOMMITTED




                                                                     REPEATABLE
                                                         COMMITTED
              exclusive locks




                                                            READ

                                                                        READ
                                               READ
            inside
                transactions
                Concurrency
                  Problem




                                Lost
                               Update
                                           X             X           X            X
                              Dirty Read   P             S           S            S
                          Inconsiste
SQL Server Magazine LIVE!     nt           P             P           S            S              25
                           Analysis
READ COMMITTED
• Default isolation level
• Avoids Dirty Reads
   – m yTr =
          an
     m yconn.Begi ans i Iol i
                 nTr acton( s atonLevelReadCom m it
                                         .            t
     ed)
   –S ELECT … FRO M … W I (
                         TH READCO M M I
                                       TTED)
   –S ELECT … FRO M … W I (
                         TH READPAS T)
   – S TRANS
      ET      ACTI N IO LATI N LEVEL READ CO M M I
                  O S      O                     TTED
• Requests Shared locks for the duration of the
  reading operation
• Requests Exclusive locks for each modification 26
SQL Server Magazine LIVE!
READ UNCOMMITTED
• Isolation level only suitable for “sneaking
  around”
   – m yTr =
          an
     m yconn.Begi ans i Iol i
                 nTr acton( s atonLevelReadUnCom m
                                         .
     it
     ted)
   –S ELECT … FRO M … W I (
                         TH READUNCO M M ITTED)
   –S ELECT … FRO M … W I ( LO CK)
                         TH NO
   – S TRANS
      ET      ACTI N IO LATI N LEVEL READ UNCO M M I
                  O S      O                       TTED
• Doesn’t request Shared locks at all
• Requests Exclusive locks for each modification
SQL Server Magazine LIVE!                            27
REPEATABLE READ
• Quite a restrictive isolation level
• Avoids all concurrency problems, except
  Phantom Reads
  – m yTr =
         an
    m yconn.Begi ans i Iol i
                nTr acton( s atonLevelRepeat eRe
                                        .      abl
    ad)
  –S ELECT … FRO M … W I (
                        TH REPEATABLEREAD)
  – S TRANS
     ET      ACTI N IO LATI N LEVEL REPEATABLE READ
                 O S      O
• Requests Shared locks for the duration of the
  transaction
• Requests Exclusive locks for each modification 28
SQL Server Magazine LIVE!
SERIALIZABLE
• The most restrictive isolation level
• Avoids all concurrency problems
   – m yTr =
          an
     m yconn.Begi ans i Iol i
                 nTr acton( s atonLevelS i i e)
                                         . eralzabl
   –S ELECT … FRO M … W I ( ERI ZABLE)
                         TH S ALI
   –S ELECT … FRO M … W I ( LDLO CK)
                         TH HO
   – S TRANS
      ET      ACTI N IO LATI N LEVEL S ALI
                  O S      O          ERI ZABLE
• Requests Shared locks for the duration of the
  transaction
• Requests Exclusive locks for each modification
SQL Server Magazine LIVE!                             29
Transactions
•   Transact-SQL transactions
•   Distributed transactions
•   .NET Manual transactions
•   .NET Automatic transactions




SQL Server Magazine LIVE!           30
Transact-SQL transactions
•   Transaction Statements
•   Nested transactions
•   Transactions and Stored Procedures
•   Transactions and Triggers




SQL Server Magazine LIVE!                31
Managing transactions with
      Transact-SQL Statements
• BEGIN TRAN
• COMMIT TRAN
• ROLLBACK TRAN




SQL Server Magazine LIVE!          32
Transaction Savepoints
• SAVE TRAN TranName
• ROLLBACK TRAN TranName




SQL Server Magazine LIVE!         33
Nested transactions
• @@TRANCOUNT tells you how many
  transaction levels you are in
• For SQL Server there is only one actual
  transaction
• Commit happens only when all nested
  transactions are ended
• Rollback cancels all nested transactions at
  once
SQL Server Magazine LIVE!                  34
Transactions and Stored
               Procedures
• After Rollback execution continues, but you are
  outside transaction boundaries
• If Rollback happens inside a procedure, the
  calling process receives error 266, Level 16:
   – Transaction count after EXECUTE indicates that a
     COMMIT or ROLLBACK TRANSACTION statement is
     missing. Previous count = 1, current count = 0.
• Good idea to use save points and inform the
  outer process using output parameters

SQL Server Magazine LIVE!                           35
Transactions and Triggers
• After Rollback execution continues inside
  the trigger, but you are outside transaction
  boundaries and the process terminates
  when the trigger does.
• Consider using INSTEAD OF triggers to
  minimize rollbacks
• Consider using cancelling operations
  instead of rollbacks

SQL Server Magazine LIVE!                    36
Distributed transactions




SQL Server Magazine LIVE!           37
.NET Manual transactions




SQL Server Magazine LIVE!         38
.NET Automatic transactions
• Apply the TransactionAttribute to your class.
• Derive your class from the
  ServicedComponent Class.
• Sign the assembly with a strong name.
  – To sign the assembly using attributes create a
    key pair using the Sn.exe utility.
  – sn -k MCTCon.snk


SQL Server Magazine LIVE!                        39
.NET Automatic transactions (2)
<Assembly: ApplicationName("MCTCON")>
<Assembly: AssemblyKeyFileAttribute("MCTCON.snk")>

<Transaction(TransactionOption.Required)> Public Class clsProduct
  Inherits ServicedComponent

  Dim myConnection As SqlConnection

  <AutoComplete()> Public Sub RaisePrice(ByVal ProductID As Integer, ByVal
   amount As Integer)
    OpenConnection()
    Updateproduct(ProductID, amount)
    CloseConnection()

  End Sub
 SQL Server Magazine LIVE!                                               40
.NET Automatic transactions (3)




SQL Server Magazine LIVE!     41
Locks
•   Dynamic locking strategy
•   Locking SQL Server resources
•   Types of locks
•   Hunting for locks




SQL Server Magazine LIVE!           42
Dynamic locking strategy
• SQL Server tries to minimize locking costs
  balancing:
   – Lock granularity
   – Lock maintenance cost
• SQL Server 2000 defaults to row lock
  when necessary
• Uses latches, lightweight synchronization
  objects, for internal operations, minimizing
  expensive locks
SQL Server Magazine LIVE!                    43
Locking SQL Server resources
• SQL Server 2000 can lock:
   – Data Row
   – Index Key
   – Any page
   – Extent
   – Table
   – Database


SQL Server Magazine LIVE!     44
Types of locks
•   Shared (S)
•   Update (U)
•   Exclusive (X)
•   Intent:
    – intent shared (IS)
    – intent exclusive (IX)
    – shared with intent exclusive (SIX)
• Schema:
    – schema modification (Sch-M)
    – schema stability (Sch-S).
• Bulk Update (BU)
SQL Server Magazine LIVE!                  45
A typical case of Deadlock
involving two connections (demo)




SQL Server Magazine LIVE!     46
A Deadlock situation involving
    more than two connections
             (demo)




SQL Server Magazine LIVE!       47
Binding connections (demo)




SQL Server Magazine LIVE!        48
Hunting for locks
• Profiler can detect locks
• Performance Monitor counts locks
• Transaction Log registers transactions. It
  doesn’t register locks
• Convert sp_lock into fn_lock
       SELECT *
       FROM ::fn_lock()
       WHERE Status = 'WAIT'

SQL Server Magazine LIVE!                      49
Using Profiler to detect locks
              (demo)




SQL Server Magazine LIVE!            50
Using Performance Monitor to
        count locks (demo)




SQL Server Magazine LIVE!     51
Detecting transactions in the
      Transaction Log (demo)




SQL Server Magazine LIVE!           52
Locking techniques from ADO.NET
• Optimistic concurrency
• Pessimistic concurrency
• User-defined concurrency




SQL Server Magazine LIVE!     53
Optimistic concurrency
• Default behavior from DataAdapter
• Based on sp_executesql
• SET clause with all new values:
   – Updated columns
   – Unchanged columns
• WHERE clause with all old values:
   – Updated columns
   – Unchanged columns

SQL Server Magazine LIVE!             54
Pessimistic Concurrency
• Implemented through SqlCommand
  objects and stored procedures
• Not scaleable:
   – Requires maintaining connection open
   – Open transaction
   – Too much locking for too much time
• Necessary in some scenarios


SQL Server Magazine LIVE!                   55
User-defined concurrency
•   Trace changes on individual columns
•   Avoid unnecessary trigger execution
•   Avoid unnecessary locks
•   Fewer conflicts
•   Requires careful design




SQL Server Magazine LIVE!                 56
User-defined concurrency from
        ADO.NET (demo)




SQL Server Magazine LIVE!     57
Application locks
• Give applications access to the SQL
  Server Lock Manager
• sp_getapplock 'resource_name',
  'lock_mode', 'lock_owner', 'lockTimeout‘
• sp_releaseapplock 'resource_name‘,
  'lock_owner' ]



SQL Server Magazine LIVE!                    58
Application locks (demo)




SQL Server Magazine LIVE!          59
Do you want to know more?
• “Inside SQL Server 2000” (Kalen Delaney, MSPress)
• “Advanced Transact-SQL for SQL Server 2000” (Itzik
  Ben-Gan & Tom Moreau, APress)
• “SQL Server 2000 Programming” (Robert Vieira, WROX)
• “Microsoft SQL Server 2000 Programming by Example”
  (Fernando G. Guerrero & Carlos Eduardo Rojas, QUE)
• SQL Server 2000 Resource Kit (MSPress & TechNet)
• Visit the Microsoft public newsgroups:
   – msnews.microsoft.com/microsoft.public.sqlserver.*
• Download the source code of this session from:
   – http://www.callsql.com/en/articles


 SQL Server Magazine LIVE!                               60
Do you want to know even
               more?
• Visit the Microsoft public newsgroups:
  – msnews.microsoft.com/microsoft.public.sql
    server.*
  – msnews.microsoft.com/microsoft.public.dot
    net.*




SQL Server Magazine LIVE!                  61
Thank you!
                      Questions?
• Download the source code of this
  session from:
   – http://www.callsql.com/en/articles
• You can contact me at:
   – fernan@guerrerog.org




SQL Server Magazine LIVE!
Thank you!
                            • Please drop off your
                              session evaluations in
                              the basket at the back
                              of the room!
                            • Your comments are
                              greatly appreciated!




SQL Server Magazine LIVE!

More Related Content

PPT
Vda305 concurrency guerrero
PDF
Oracle10g new features
PDF
Microsoft SQL Server Distributing Data with R2 Bertucci
PDF
Dba 3+ exp qus
PPT
Application_Performance_V1
PPT
Application_Performance_V1
PPT
Application_Performance_V1
PDF
MySQL Cluster performance best practices
Vda305 concurrency guerrero
Oracle10g new features
Microsoft SQL Server Distributing Data with R2 Bertucci
Dba 3+ exp qus
Application_Performance_V1
Application_Performance_V1
Application_Performance_V1
MySQL Cluster performance best practices

Viewers also liked (7)

PPTX
Solid q universidad empresa 2011 10 27
PPT
Dealing with SQL Security from ADO.NET
PPT
Achieve the Impossible: Use INSTEAD OF triggers in SQL Server 2000 to Deal Tr...
PPTX
New gTLDs between two rounds: trade mark challenges
PPTX
Itinerarios de Grado de Ingenieria Informatica EPS Alicante
PPT
Udf eficientes
PDF
Arquitectura bioclimatica ing zulma cabrera
Solid q universidad empresa 2011 10 27
Dealing with SQL Security from ADO.NET
Achieve the Impossible: Use INSTEAD OF triggers in SQL Server 2000 to Deal Tr...
New gTLDs between two rounds: trade mark challenges
Itinerarios de Grado de Ingenieria Informatica EPS Alicante
Udf eficientes
Arquitectura bioclimatica ing zulma cabrera
Ad

Similar to Concurrency problems and locking techniques in SQL Server 2000 and VB.NET (20)

PDF
Difference between sql server 2008 and sql server 2012
DOC
Business Intelligence Portfolio
ODP
MySQL Stored Procedures: Building High Performance Web Applications
PPTX
SQL Server 2012 Best Practices
PDF
Chris Bull's Bi Portfolio
DOC
Sql queries
PDF
TSQL Coding Guidelines
PDF
Sql coding-standard-sqlserver
PPT
Greg Lewis SQL Portfolio
PPTX
SQL Server Developer 70-433
PPTX
Mis04
PPSX
IM01: Business Intelligence
PPT
SQL Server 2008 Overview
PPT
What's New for Developers in SQL Server 2008?
PDF
Avoiding cursors with sql server 2005 tech republic
PPTX
Sql server 2012 roadshow masd overview 003
PDF
Microsoft SQL Server Filtered Indexes & Sparse Columns Feb 2011
PDF
Sql ch 5
PPTX
Business Intelligence Portfolio
Difference between sql server 2008 and sql server 2012
Business Intelligence Portfolio
MySQL Stored Procedures: Building High Performance Web Applications
SQL Server 2012 Best Practices
Chris Bull's Bi Portfolio
Sql queries
TSQL Coding Guidelines
Sql coding-standard-sqlserver
Greg Lewis SQL Portfolio
SQL Server Developer 70-433
Mis04
IM01: Business Intelligence
SQL Server 2008 Overview
What's New for Developers in SQL Server 2008?
Avoiding cursors with sql server 2005 tech republic
Sql server 2012 roadshow masd overview 003
Microsoft SQL Server Filtered Indexes & Sparse Columns Feb 2011
Sql ch 5
Business Intelligence Portfolio
Ad

More from Fernando G. Guerrero (6)

PPT
Dealing with SQL Security from ADO.NET
PPTX
Datos Geométricos y Espaciales en SQL Server 2008
PPTX
Microsoft Changed the Game Again and Gave New Wings to an Entire Industry
PPTX
Making business sense of the continuous and anarchic flow of Social Media data
PPTX
Designing Role-Based Database Systems to Achieve Unlimited Database Scalability
PDF
Data Mining for Moderation of Social Data
Dealing with SQL Security from ADO.NET
Datos Geométricos y Espaciales en SQL Server 2008
Microsoft Changed the Game Again and Gave New Wings to an Entire Industry
Making business sense of the continuous and anarchic flow of Social Media data
Designing Role-Based Database Systems to Achieve Unlimited Database Scalability
Data Mining for Moderation of Social Data

Recently uploaded (20)

PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
PDF
Transforming Manufacturing operations through Intelligent Integrations
PDF
Sensors and Actuators in IoT Systems using pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Advanced Soft Computing BINUS July 2025.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Empathic Computing: Creating Shared Understanding
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
MYSQL Presentation for SQL database connectivity
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Telecom Fraud Prevention Guide | Hyperlink InfoSystem
PDF
CIFDAQ's Market Wrap: Ethereum Leads, Bitcoin Lags, Institutions Shift
PDF
cuic standard and advanced reporting.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Modernizing your data center with Dell and AMD
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
GDG Cloud Iasi [PUBLIC] Florian Blaga - Unveiling the Evolution of Cybersecur...
Transforming Manufacturing operations through Intelligent Integrations
Sensors and Actuators in IoT Systems using pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Dropbox Q2 2025 Financial Results & Investor Presentation
Per capita expenditure prediction using model stacking based on satellite ima...
Advanced Soft Computing BINUS July 2025.pdf
Spectral efficient network and resource selection model in 5G networks
Empathic Computing: Creating Shared Understanding
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
MYSQL Presentation for SQL database connectivity
The Rise and Fall of 3GPP – Time for a Sabbatical?
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Telecom Fraud Prevention Guide | Hyperlink InfoSystem
CIFDAQ's Market Wrap: Ethereum Leads, Bitcoin Lags, Institutions Shift
cuic standard and advanced reporting.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
Chapter 3 Spatial Domain Image Processing.pdf
Modernizing your data center with Dell and AMD

Concurrency problems and locking techniques in SQL Server 2000 and VB.NET

  • 1. Session SAD335 Concurrency problems and locking techniques in SQL Server 2000 and VB.NET Fernando G. Guerrero SQL Server MVP .NET Technical Lead QA plc October 2002
  • 2. Quick info about Fernando (2 milliseconds) • MCSD, MCSE+Internet (W2K), MCDBA, MCT, QA SQL Server MVP • This is where I work: QA, The best learning environment in Europe • Writing for SQL Sever Magazine and SQL Server Professional • This is my main web site: www.callsql.com • This is my book (so far): – Microsoft SQL Server 2000 Programming by Example (ISBN : 0789724499, co-authored with Carlos Eduardo Rojas) • Currently writing on ADO.NET and SQL Server 2000 SQL Server Magazine LIVE!
  • 3. Agenda • Concurrency problems • Isolation levels • Locks • Transactions SQL Server Magazine LIVE! 3
  • 4. Concurrency problems • Lost Updates • Uncommitted Dependency • Inconsistent Analysis • Phantom Reads SQL Server Magazine LIVE! 4
  • 5. Lost Updates (1) Peter Paul Peter UnitPric UnitPric Paul e e 10.0 10.0 SQL Server Magazine LIVE! Mary 5 (SQL Server)
  • 6. Lost Updates (2) Peter Paul Peter UnitPric @UP * UnitPric Paul e 1.2 e 10.0 12.0 10.0 DECLARE @UP money SELECT @UP = UnitPrice FROM Products WHERE ProductID = 25 SQL Server Magazine LIVE! Mary 6 (SQL Server)
  • 7. Lost Updates (3) Peter Paul Peter UnitPric @UP * UnitPric @UP * Paul e 1.2 e 1.1 10.0 12.0 10.0 11.0 DECLARE @UP money DECLARE @UP money SELECT @UP = UnitPrice FROM Products WHERE ProductID = 25 SELECT @UP = UnitPrice FROM Products WHERE ProductID = 25 SQL Server Magazine LIVE! Mary 7 (SQL Server)
  • 8. Lost Updates (4) Peter Paul Peter UnitPric @UP * UnitPric @UP * Paul e 1.2 e 1.1 DECLARE @UP money 12.0 12.0 12.0 11.0 DECLARE @UP money SELECT @UP = UnitPrice SELECT @UP = UnitPrice FROM Products FROM Products WHERE ProductID = 25 WHERE ProductID = 25 UPDATE Products SET UnitPrice = @UP * 1.2 WHERE ProductID = 25 SQL Server Magazine LIVE! Mary 8 (SQL Server)
  • 9. Lost Updates (5) Peter Paul Peter UnitPric @UP * UnitPric @UP * Paul e 1.2 e 1.1 DECLARE @UP money 11.0 12.0 11.0 11.0 DECLARE @UP money SELECT @UP = UnitPrice SELECT @UP = UnitPrice FROM Products FROM Products WHERE ProductID = 25 WHERE ProductID = 25 UPDATE Products SET UnitPrice = @UP * 1.2 WHERE ProductID = 25 UPDATE Products SET UnitPrice = @UP * 1.1 WHERE ProductID = 25 SQL Server Magazine LIVE! Mary 9 (SQL Server)
  • 10. Uncommitted Dependency (1) Peter Paul Peter UnitPric UnitPric Paul e e 10.0 10.0 SQL Server Magazine LIVE! Mary 10 (SQL Server)
  • 11. Uncommitted Dependency (2) Peter Paul Peter UnitPric UnitPric Paul e e 12.0 12.0 BEGIN TRANSACTION UPDATE PRODUCTS SET UnitPrice = UnitPrice * 1.2 WHERE ProductID = 25 SQL Server Magazine LIVE! Mary 11 (SQL Server)
  • 12. Uncommitted Dependency (3) Peter Paul Peter UnitPric UnitPric @UP Paul e e 12.0 12.0 12.0 BEGIN TRANSACTION DECLARE @UP money UPDATE PRODUCTS SET UnitPrice = UnitPrice * 1.2 WHERE ProductID = 25 SELECT @UP = UnitPrice FROM Products (NOLOCK) WHERE ProductID = 25 SQL Server Magazine LIVE! Mary 12 (SQL Server)
  • 13. Uncommitted Dependency (4) Peter Paul Peter UnitPric UnitPric @UP Paul e e BEGIN TRANSACTION 12.0 10.0 12.0 10.0 12.0 DECLARE @UP money UPDATE PRODUCTS SELECT @UP = UnitPrice SET UnitPrice = UnitPrice * 1.2 FROM Products WHERE ProductID = 25 WHERE ProductID = 25 ROLLBACK TRANSACTION SQL Server Magazine LIVE! Mary 13 (SQL Server)
  • 14. Uncommitted Dependency (5) Peter Paul Peter UnitPric UnitPric @UP Paul e e BEGIN TRANSACTION 10.0 10.0 12.0 DECLARE @UP money UPDATE PRODUCTS SELECT @UP = UnitPrice SET UnitPrice = UnitPrice * 1.2 FROM Products WHERE ProductID = 25 WHERE ProductID = 25 ROLLBACK TRANSACTION INSERT [Order details] ( OrderID, ProductID, UnitPrice, Quantity, Discount) VALUES (25365, 25, SQL Server Magazine LIVE! Mary @UP, 10, 0.1) 14 (SQL Server)
  • 15. Inconsistent Analysis (1) Peter Peter Paul SQL Server Magazine LIVE! Mary 15 (SQL Server)
  • 16. Inconsistent Analysis (2) Peter Peter @Count 830 Paul @Total @Average @Total / DECLARE @Count int, @Count @Total money, @Average money SELECT @Count = COUNT(DISTINCT OrderID) FROM [Order Details] Mary SQL Server Magazine LIVE! 16 (SQL Server)
  • 17. Inconsistent Analysis (3) Peter Peter @Count 830 Paul @Total DECLARE @Count int, @Total money, @Average @Average money SELECT @Count = @Total / COUNT(DISTINCT OrderID) @Count FROM [Order Details] UPDATE [Order details SET Quantity = 600 WHERE OrderID = 10272 AND ProductID = 20 SQL Server Magazine LIVE! Mary 17 (SQL Server)
  • 18. Inconsistent Analysis (4) Peter Peter @Count 830 Paul @Total 1304284.2 DECLARE @Count int, 4 UPDATE [Order details] @Total money, SET Quantity = 600 @Average money @Average WHERE OrderID = 10272 SELECT @Count = AND ProductID = 20 COUNT(DISTINCT OrderID) @Total / 1571.43 FROM [Order Details] @Count SELECT @Total = SUM(UnitPrice * Quantity * (1 – Discount)) FROM [Order Details] SQL Server Magazine LIVE! Mary 18 (SQL Server)
  • 19. Inconsistent Analysis (5) Peter Peter @Count 830 Paul @Total 1304284.2 DECLARE @Count int, 4 UPDATE [Order details] @Total money, SET Quantity = 600 @Average money @Average WHERE OrderID = 10272 SELECT @Count = AND ProductID = 20 COUNT(DISTINCT OrderID) @Total / 1571.43 FROM [Order Details] @Count SELECT @Total = SUM(UnitPrice * Quantity * (1 – Discount)) FROM [Order Details] UPDATE [Order details] SET Discount = 0.4 WHERE ProductID = SQL Server Magazine LIVE! Mary20 19 (SQL Server)
  • 20. Inconsistent Analysis (6) Peter Peter @Count 830 Paul @Total 1304284.2 DECLARE @Count int, 4 UPDATE [Order details] @Total money, SET Quantity = 600 @Average money @Average 1542.78 WHERE OrderID = 10272 SELECT @Count = AND ProductID = 20 COUNT(DISTINCT OrderID) @Total / 1571.43 FROM [Order Details] @Count UPDATE [Order details] SET Discount = 0.4 SELECT @Total = WHERE ProductID = 20 SUM(UnitPrice * Quantity * (1 – Discount)) FROM [Order Details] SELECT @Average = AVG(TotalPrice) FROM (…) AS TotOrders SQL Server Magazine LIVE! Mary 20 (SQL Server)
  • 21. Phantom Reads (1) OrderID ProductI UnitPrice Peter D Paul 10259 37 20.8 10337 37 20.8 10408 37 20.8 10523 37 26.0 10847 37 26.0 10966 37 26.0 SELECT OrderID, ProductID, UnitPrice FROM [Order Details] WHERE ProductID = 37 SQL Server Magazine LIVE! Mary 21 (SQL Server)
  • 22. Phantom Reads (2) OrderID ProductI UnitPrice Peter D Paul 10259 37 20.80 10337 37 20.80 SELECT OrderID, ProductID, 10408 37 20.80 UnitPrice FROM [Order Details] 10523 37 26.00 WHERE ProductID = 37 10847 37 26.00 10966 37 26.00 10615 37 INSERT [Order 31.54 details] (OrderID, ProductID, UnitPrice, MaryQuantity, (SQL Server) Discount) SQL Server Magazine LIVE! 22
  • 23. Phantom Reads (3) OrderID ProductI UnitPrice Peter D Paul 10259 37 20.80 10337 37 20.80 SELECT OrderID, INSERT [Order details] ProductID, 10408 37 20.80 (OrderID, ProductID, UnitPrice UnitPrice, Quantity, FROM [Order Details] 10523 37 26.00 Discount) WHERE ProductID = 37 10847 37 26.00 VALUES (10615, 37, 31.54, 20, 0.1) 10966 37 26.00 10615 37 31.54 SELECT OrderID, ProductID, UnitPrice FROM [Order Details] WHERE ProductID = 37 SQL Server Magazine LIVE! Mary 23 (SQL Server)
  • 24. Isolation levels • Transact-SQL: – READ COMMITTED – READ UNCOMMITTED – REPEATABLE READ – SERIALIZABLE • Extra .NET Isolation Levels: – Chaos (not valid for SQLClient) – Unspecified (not settable for SQLClient) SQL Server Magazine LIVE! 24
  • 25. Isolation levels vs. Concurrency problems P Problem Isolation S Solution Level X SERIALIZABLE solved by standard UNCOMMITTED REPEATABLE COMMITTED exclusive locks READ READ READ inside transactions Concurrency Problem Lost Update X X X X Dirty Read P S S S Inconsiste SQL Server Magazine LIVE! nt P P S S 25 Analysis
  • 26. READ COMMITTED • Default isolation level • Avoids Dirty Reads – m yTr = an m yconn.Begi ans i Iol i nTr acton( s atonLevelReadCom m it . t ed) –S ELECT … FRO M … W I ( TH READCO M M I TTED) –S ELECT … FRO M … W I ( TH READPAS T) – S TRANS ET ACTI N IO LATI N LEVEL READ CO M M I O S O TTED • Requests Shared locks for the duration of the reading operation • Requests Exclusive locks for each modification 26 SQL Server Magazine LIVE!
  • 27. READ UNCOMMITTED • Isolation level only suitable for “sneaking around” – m yTr = an m yconn.Begi ans i Iol i nTr acton( s atonLevelReadUnCom m . it ted) –S ELECT … FRO M … W I ( TH READUNCO M M ITTED) –S ELECT … FRO M … W I ( LO CK) TH NO – S TRANS ET ACTI N IO LATI N LEVEL READ UNCO M M I O S O TTED • Doesn’t request Shared locks at all • Requests Exclusive locks for each modification SQL Server Magazine LIVE! 27
  • 28. REPEATABLE READ • Quite a restrictive isolation level • Avoids all concurrency problems, except Phantom Reads – m yTr = an m yconn.Begi ans i Iol i nTr acton( s atonLevelRepeat eRe . abl ad) –S ELECT … FRO M … W I ( TH REPEATABLEREAD) – S TRANS ET ACTI N IO LATI N LEVEL REPEATABLE READ O S O • Requests Shared locks for the duration of the transaction • Requests Exclusive locks for each modification 28 SQL Server Magazine LIVE!
  • 29. SERIALIZABLE • The most restrictive isolation level • Avoids all concurrency problems – m yTr = an m yconn.Begi ans i Iol i nTr acton( s atonLevelS i i e) . eralzabl –S ELECT … FRO M … W I ( ERI ZABLE) TH S ALI –S ELECT … FRO M … W I ( LDLO CK) TH HO – S TRANS ET ACTI N IO LATI N LEVEL S ALI O S O ERI ZABLE • Requests Shared locks for the duration of the transaction • Requests Exclusive locks for each modification SQL Server Magazine LIVE! 29
  • 30. Transactions • Transact-SQL transactions • Distributed transactions • .NET Manual transactions • .NET Automatic transactions SQL Server Magazine LIVE! 30
  • 31. Transact-SQL transactions • Transaction Statements • Nested transactions • Transactions and Stored Procedures • Transactions and Triggers SQL Server Magazine LIVE! 31
  • 32. Managing transactions with Transact-SQL Statements • BEGIN TRAN • COMMIT TRAN • ROLLBACK TRAN SQL Server Magazine LIVE! 32
  • 33. Transaction Savepoints • SAVE TRAN TranName • ROLLBACK TRAN TranName SQL Server Magazine LIVE! 33
  • 34. Nested transactions • @@TRANCOUNT tells you how many transaction levels you are in • For SQL Server there is only one actual transaction • Commit happens only when all nested transactions are ended • Rollback cancels all nested transactions at once SQL Server Magazine LIVE! 34
  • 35. Transactions and Stored Procedures • After Rollback execution continues, but you are outside transaction boundaries • If Rollback happens inside a procedure, the calling process receives error 266, Level 16: – Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 1, current count = 0. • Good idea to use save points and inform the outer process using output parameters SQL Server Magazine LIVE! 35
  • 36. Transactions and Triggers • After Rollback execution continues inside the trigger, but you are outside transaction boundaries and the process terminates when the trigger does. • Consider using INSTEAD OF triggers to minimize rollbacks • Consider using cancelling operations instead of rollbacks SQL Server Magazine LIVE! 36
  • 38. .NET Manual transactions SQL Server Magazine LIVE! 38
  • 39. .NET Automatic transactions • Apply the TransactionAttribute to your class. • Derive your class from the ServicedComponent Class. • Sign the assembly with a strong name. – To sign the assembly using attributes create a key pair using the Sn.exe utility. – sn -k MCTCon.snk SQL Server Magazine LIVE! 39
  • 40. .NET Automatic transactions (2) <Assembly: ApplicationName("MCTCON")> <Assembly: AssemblyKeyFileAttribute("MCTCON.snk")> <Transaction(TransactionOption.Required)> Public Class clsProduct Inherits ServicedComponent Dim myConnection As SqlConnection <AutoComplete()> Public Sub RaisePrice(ByVal ProductID As Integer, ByVal amount As Integer) OpenConnection() Updateproduct(ProductID, amount) CloseConnection() End Sub SQL Server Magazine LIVE! 40
  • 41. .NET Automatic transactions (3) SQL Server Magazine LIVE! 41
  • 42. Locks • Dynamic locking strategy • Locking SQL Server resources • Types of locks • Hunting for locks SQL Server Magazine LIVE! 42
  • 43. Dynamic locking strategy • SQL Server tries to minimize locking costs balancing: – Lock granularity – Lock maintenance cost • SQL Server 2000 defaults to row lock when necessary • Uses latches, lightweight synchronization objects, for internal operations, minimizing expensive locks SQL Server Magazine LIVE! 43
  • 44. Locking SQL Server resources • SQL Server 2000 can lock: – Data Row – Index Key – Any page – Extent – Table – Database SQL Server Magazine LIVE! 44
  • 45. Types of locks • Shared (S) • Update (U) • Exclusive (X) • Intent: – intent shared (IS) – intent exclusive (IX) – shared with intent exclusive (SIX) • Schema: – schema modification (Sch-M) – schema stability (Sch-S). • Bulk Update (BU) SQL Server Magazine LIVE! 45
  • 46. A typical case of Deadlock involving two connections (demo) SQL Server Magazine LIVE! 46
  • 47. A Deadlock situation involving more than two connections (demo) SQL Server Magazine LIVE! 47
  • 48. Binding connections (demo) SQL Server Magazine LIVE! 48
  • 49. Hunting for locks • Profiler can detect locks • Performance Monitor counts locks • Transaction Log registers transactions. It doesn’t register locks • Convert sp_lock into fn_lock SELECT * FROM ::fn_lock() WHERE Status = 'WAIT' SQL Server Magazine LIVE! 49
  • 50. Using Profiler to detect locks (demo) SQL Server Magazine LIVE! 50
  • 51. Using Performance Monitor to count locks (demo) SQL Server Magazine LIVE! 51
  • 52. Detecting transactions in the Transaction Log (demo) SQL Server Magazine LIVE! 52
  • 53. Locking techniques from ADO.NET • Optimistic concurrency • Pessimistic concurrency • User-defined concurrency SQL Server Magazine LIVE! 53
  • 54. Optimistic concurrency • Default behavior from DataAdapter • Based on sp_executesql • SET clause with all new values: – Updated columns – Unchanged columns • WHERE clause with all old values: – Updated columns – Unchanged columns SQL Server Magazine LIVE! 54
  • 55. Pessimistic Concurrency • Implemented through SqlCommand objects and stored procedures • Not scaleable: – Requires maintaining connection open – Open transaction – Too much locking for too much time • Necessary in some scenarios SQL Server Magazine LIVE! 55
  • 56. User-defined concurrency • Trace changes on individual columns • Avoid unnecessary trigger execution • Avoid unnecessary locks • Fewer conflicts • Requires careful design SQL Server Magazine LIVE! 56
  • 57. User-defined concurrency from ADO.NET (demo) SQL Server Magazine LIVE! 57
  • 58. Application locks • Give applications access to the SQL Server Lock Manager • sp_getapplock 'resource_name', 'lock_mode', 'lock_owner', 'lockTimeout‘ • sp_releaseapplock 'resource_name‘, 'lock_owner' ] SQL Server Magazine LIVE! 58
  • 59. Application locks (demo) SQL Server Magazine LIVE! 59
  • 60. Do you want to know more? • “Inside SQL Server 2000” (Kalen Delaney, MSPress) • “Advanced Transact-SQL for SQL Server 2000” (Itzik Ben-Gan & Tom Moreau, APress) • “SQL Server 2000 Programming” (Robert Vieira, WROX) • “Microsoft SQL Server 2000 Programming by Example” (Fernando G. Guerrero & Carlos Eduardo Rojas, QUE) • SQL Server 2000 Resource Kit (MSPress & TechNet) • Visit the Microsoft public newsgroups: – msnews.microsoft.com/microsoft.public.sqlserver.* • Download the source code of this session from: – http://www.callsql.com/en/articles SQL Server Magazine LIVE! 60
  • 61. Do you want to know even more? • Visit the Microsoft public newsgroups: – msnews.microsoft.com/microsoft.public.sql server.* – msnews.microsoft.com/microsoft.public.dot net.* SQL Server Magazine LIVE! 61
  • 62. Thank you! Questions? • Download the source code of this session from: – http://www.callsql.com/en/articles • You can contact me at: – [email protected] SQL Server Magazine LIVE!
  • 63. Thank you! • Please drop off your session evaluations in the basket at the back of the room! • Your comments are greatly appreciated! SQL Server Magazine LIVE!