SlideShare uma empresa Scribd logo
1 de 63
Session
VDA305

  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

VS .NET Connections
Agenda
•   Concurrency problems
•   Isolation levels
•   Locks
•   Transactions




VS .NET Connections            3
Concurrency problems
•   Lost Updates
•   Uncommitted Dependency
•   Inconsistent Analysis
•   Phantom Reads




VS .NET Connections              4
Lost Updates (1)
                         Peter            Paul
Peter             UnitPric         UnitPric
                                                 Paul
                  e                e
                  10.0             10.0




 VS .NET Connections
                                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




 VS .NET Connections
                                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




   VS .NET Connections
                                       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


   VS .NET Connections
                                       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


   VS .NET Connections
                                          Mary
                                                                                 9
                                       (SQL Server)
Uncommitted Dependency (1)
                         Peter            Paul
Peter             UnitPric         UnitPric
                                                 Paul
                  e                e
                  10.0             10.0




 VS .NET Connections
                                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



 VS .NET Connections
                                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




   VS .NET Connections
                                         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




   VS .NET Connections
                                         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,
   VS .NET Connections
                                         Mary                @UP,   10, 0.1)
                                                                           14
                                      (SQL Server)
Inconsistent Analysis (1)
                         Peter
Peter                                 Paul




 VS .NET Connections
                          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 .NET Connections
   VS
       [Order Details] Mary                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



   VS .NET Connections
                                     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]

   VS .NET Connections
                                     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 =
   VS .NET Connections
                                        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
    VS .NET Connections
                                      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
  VS .NET Connections
                              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)
   VS .NET Connections                                      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
   VS .NET Connections
                                   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)

VS .NET Connections                             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
VS .NET Connections               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
VS .NET Connections
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
VS .NET Connections                                  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
VS .NET Connections
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
VS .NET Connections                                   29
Transactions
•   Transact-SQL transactions
•   Distributed transactions
•   .NET Manual transactions
•   .NET Automatic transactions




VS .NET Connections                  30
Transact-SQL transactions
•   Transaction Statements
•   Nested transactions
•   Transactions and Stored Procedures
•   Transactions and Triggers




VS .NET Connections                      31
Managing transactions with
      Transact-SQL Statements
• BEGIN TRAN
• COMMIT TRAN
• ROLLBACK TRAN




VS .NET Connections                32
Transaction Savepoints
• SAVE TRAN TranName
• ROLLBACK TRAN TranName




VS .NET Connections               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
VS .NET Connections                        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

VS .NET Connections                                 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

VS .NET Connections                          36
Distributed transactions




VS .NET Connections                 37
.NET Manual transactions




VS .NET Connections              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


VS .NET Connections                              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
 VS .NET Connections                                                     40
.NET Automatic transactions (3)




VS .NET Connections           41
Locks
•   Dynamic locking strategy
•   Locking SQL Server resources
•   Types of locks
•   Hunting for locks




VS .NET Connections                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
VS .NET Connections                          43
Locking SQL Server resources
• SQL Server 2000 can lock:
   – Data Row
   – Index Key
   – Any page
   – Extent
   – Table
   – Database


VS .NET Connections           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)
VS .NET Connections                        45
A typical case of Deadlock
involving two connections (demo)




VS .NET Connections           46
A Deadlock situation involving
    more than two connections
             (demo)




VS .NET Connections             47
Binding connections (demo)




VS .NET Connections              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'

VS .NET Connections                            49
Using Profiler to detect locks
              (demo)




VS .NET Connections                  50
Using Performance Monitor to
        count locks (demo)




VS .NET Connections           51
Detecting transactions in the
      Transaction Log (demo)




VS .NET Connections                 52
Locking techniques from ADO.NET
• Optimistic concurrency
• Pessimistic concurrency
• User-defined concurrency




VS .NET Connections           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

VS .NET Connections                   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


VS .NET Connections                         55
User-defined concurrency
•   Trace changes on individual columns
•   Avoid unnecessary trigger execution
•   Avoid unnecessary locks
•   Fewer conflicts
•   Requires careful design




VS .NET Connections                       56
User-defined concurrency from
        ADO.NET (demo)




VS .NET Connections           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' ]



VS .NET Connections                          58
Application locks (demo)




VS .NET Connections                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


 VS .NET Connections                                     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.*




VS .NET Connections                        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




VS .NET Connections
Thank you!
                           • Please drop off your
                             session evaluations in
                             the basket at the back
                             of the room!
                           • Your comments are
                             greatly appreciated!




VS .NET Connections

Mais conteúdo relacionado

Mais de Fernando G. Guerrero

Dealing with SQL Security from ADO.NET
Dealing with SQL Security from ADO.NETDealing with SQL Security from ADO.NET
Dealing with SQL Security from ADO.NETFernando G. Guerrero
 
Datos Geométricos y Espaciales en SQL Server 2008
Datos Geométricos y Espaciales en SQL Server 2008Datos Geométricos y Espaciales en SQL Server 2008
Datos Geométricos y Espaciales en SQL Server 2008Fernando G. Guerrero
 
Microsoft Changed the Game Again and Gave New Wings to an Entire Industry
Microsoft Changed the Game Again and Gave New Wings to an Entire IndustryMicrosoft Changed the Game Again and Gave New Wings to an Entire Industry
Microsoft Changed the Game Again and Gave New Wings to an Entire IndustryFernando G. Guerrero
 
Making business sense of the continuous and anarchic flow of Social Media data
Making business sense of the continuous and anarchic flow of Social Media dataMaking business sense of the continuous and anarchic flow of Social Media data
Making business sense of the continuous and anarchic flow of Social Media dataFernando G. Guerrero
 
Designing Role-Based Database Systems to Achieve Unlimited Database Scalability
Designing Role-Based Database Systems to Achieve Unlimited Database ScalabilityDesigning Role-Based Database Systems to Achieve Unlimited Database Scalability
Designing Role-Based Database Systems to Achieve Unlimited Database ScalabilityFernando G. Guerrero
 
Data Mining for Moderation of Social Data
Data Mining for Moderation of Social DataData Mining for Moderation of Social Data
Data Mining for Moderation of Social DataFernando G. Guerrero
 

Mais de Fernando G. Guerrero (6)

Dealing with SQL Security from ADO.NET
Dealing with SQL Security from ADO.NETDealing with SQL Security from ADO.NET
Dealing with SQL Security from ADO.NET
 
Datos Geométricos y Espaciales en SQL Server 2008
Datos Geométricos y Espaciales en SQL Server 2008Datos Geométricos y Espaciales en SQL Server 2008
Datos Geométricos y Espaciales en SQL Server 2008
 
Microsoft Changed the Game Again and Gave New Wings to an Entire Industry
Microsoft Changed the Game Again and Gave New Wings to an Entire IndustryMicrosoft Changed the Game Again and Gave New Wings to an Entire Industry
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
Making business sense of the continuous and anarchic flow of Social Media dataMaking business sense of the continuous and anarchic flow of Social Media data
Making business sense of the continuous and anarchic flow of Social Media data
 
Designing Role-Based Database Systems to Achieve Unlimited Database Scalability
Designing Role-Based Database Systems to Achieve Unlimited Database ScalabilityDesigning Role-Based Database Systems to Achieve Unlimited Database Scalability
Designing Role-Based Database Systems to Achieve Unlimited Database Scalability
 
Data Mining for Moderation of Social Data
Data Mining for Moderation of Social DataData Mining for Moderation of Social Data
Data Mining for Moderation of Social Data
 

Último

Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 

Último (20)

Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 

Vda305 concurrency guerrero

  • 1. Session VDA305 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 VS .NET Connections
  • 3. Agenda • Concurrency problems • Isolation levels • Locks • Transactions VS .NET Connections 3
  • 4. Concurrency problems • Lost Updates • Uncommitted Dependency • Inconsistent Analysis • Phantom Reads VS .NET Connections 4
  • 5. Lost Updates (1) Peter Paul Peter UnitPric UnitPric Paul e e 10.0 10.0 VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections Mary 9 (SQL Server)
  • 10. Uncommitted Dependency (1) Peter Paul Peter UnitPric UnitPric Paul e e 10.0 10.0 VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections 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, VS .NET Connections Mary @UP, 10, 0.1) 14 (SQL Server)
  • 15. Inconsistent Analysis (1) Peter Peter Paul VS .NET Connections 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 .NET Connections VS [Order Details] Mary 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 VS .NET Connections 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] VS .NET Connections 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 = VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections 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) VS .NET Connections 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 VS .NET Connections 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) VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections
  • 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 VS .NET Connections 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 VS .NET Connections
  • 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 VS .NET Connections 29
  • 30. Transactions • Transact-SQL transactions • Distributed transactions • .NET Manual transactions • .NET Automatic transactions VS .NET Connections 30
  • 31. Transact-SQL transactions • Transaction Statements • Nested transactions • Transactions and Stored Procedures • Transactions and Triggers VS .NET Connections 31
  • 32. Managing transactions with Transact-SQL Statements • BEGIN TRAN • COMMIT TRAN • ROLLBACK TRAN VS .NET Connections 32
  • 33. Transaction Savepoints • SAVE TRAN TranName • ROLLBACK TRAN TranName VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections 36
  • 38. .NET Manual transactions VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections 40
  • 41. .NET Automatic transactions (3) VS .NET Connections 41
  • 42. Locks • Dynamic locking strategy • Locking SQL Server resources • Types of locks • Hunting for locks VS .NET Connections 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 VS .NET Connections 43
  • 44. Locking SQL Server resources • SQL Server 2000 can lock: – Data Row – Index Key – Any page – Extent – Table – Database VS .NET Connections 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) VS .NET Connections 45
  • 46. A typical case of Deadlock involving two connections (demo) VS .NET Connections 46
  • 47. A Deadlock situation involving more than two connections (demo) VS .NET Connections 47
  • 48. Binding connections (demo) VS .NET Connections 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' VS .NET Connections 49
  • 50. Using Profiler to detect locks (demo) VS .NET Connections 50
  • 51. Using Performance Monitor to count locks (demo) VS .NET Connections 51
  • 52. Detecting transactions in the Transaction Log (demo) VS .NET Connections 52
  • 53. Locking techniques from ADO.NET • Optimistic concurrency • Pessimistic concurrency • User-defined concurrency VS .NET Connections 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 VS .NET Connections 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 VS .NET Connections 55
  • 56. User-defined concurrency • Trace changes on individual columns • Avoid unnecessary trigger execution • Avoid unnecessary locks • Fewer conflicts • Requires careful design VS .NET Connections 56
  • 57. User-defined concurrency from ADO.NET (demo) VS .NET Connections 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' ] VS .NET Connections 58
  • 59. Application locks (demo) VS .NET Connections 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 VS .NET Connections 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.* VS .NET Connections 61
  • 62. 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 VS .NET Connections
  • 63. Thank you! • Please drop off your session evaluations in the basket at the back of the room! • Your comments are greatly appreciated! VS .NET Connections