Handling dead lock

xiaoxiao2021-03-06  42

/ * - Handle the deadlock to see the current process, or deadlock process, and automatically kill the death process because it is dead, so if there is a deadlock process, you can only view the deadlock process. Of course, you can control, No matter if there is any dead lock, only the deadlock process is grateful: CAIYUNXIA, JIANGOPEN two reference information - Zou Jian 2004.4- * /

/ * - Call example EXEC P_LOCKINFO - * /

Create

PROC

P_lockinfo @ Kill_lock_spid

Bit

=

1

,

-

Whether to kill the deadlock process, 1 kill, 0 only

@Show_SPID_IF_NOLOCK

Bit

=

1

-

If there is no deadlock process, do you display a normal process information, 1 display, 0 does not display

AS

set

Nocount

on

Declare

@count

int

, @ s

nvarchar

(

1000

), @ i

int

SELECT

id

=

Identity

(

int

,

1

,

1

), Logo, process ID

=

SPID, thread ID

=

KPID, block process ID

=

Blocked, database ID

=

DBID, database name

=

DB_NAME

(DBID), user ID

=

UID, username

=

Loginame, accumulated CPU time

=

CPU, login time

=

Login_time, open the number of transactions

=

Open_TRAN, process status

=

Status, work station name

=

Hostname, application name

=

Program_name, workstation process ID

=

HostProcess, domain name

=

NT_DOMAIN, NIC address

=

NET_ADDRESS

INTO

#T #T #T

From

(

SELECT

Sign

=

'

Deadlock process

'

, SPID, KPID, A. Blocked, DBID, UID, Loginame, CPU, Login_Time, Open_TRAN, STATUS, HOSTNAME, PROGRAM_NAME, HOSTPROCESS, NT_DOMAIN, NET_ADDRESS, S1

=

A.SPID, S2

=

0

From

Master..xysprocesses a

Join

(

SELECT

Blocked

From

Master..xysprocesses

group

BY

Blocked) B

on

a.spid

=

B.Blocked

WHERE

a.blocked

=

0

union

all

SELECT

'

| _ Sacrifice _>

'

, SPID, KPID, Blocked, DBID, UID, Loginame, CPU, Login_Time, Open_TRAN, STATUS, HOSTNAME, Program_name, HostProcess, NT_DOMAIN, NET_ADDRESS, S1

=

Blocked, S2

=

1

From

Master..xysprocesses a

WHERE

Blocked

<>

0

) a

ORDER

BY

S1, S2

SELECT

@count

=

@@ rowcount, @ i

=

1

IF

@count

=

0

and

@Show_SPID_IF_NOLOCK

=

1

Begin

insert

#T #T #T

SELECT

Sign

=

'

Normal process

'

, SPID, KPID, Blocked, DBID,

DB_NAME

(DBID), UID, Loginame, CPU, Login_Time, Open_TRAN, STATUS, HOSTNAME, Program_Name, HostProcess, NT_DOMAIN, NET_ADDRESS

From

Master..xysprocesses

set

@count

=

@@ rowcount

end

IF

@count

>

0

Begin

Create

TABLE

# T1 (id)

int

Identity

(

1

,

1

), a

nvarchar

(

30

), B

Int

EventInfo

nvarchar

(

255

))

IF

@kill_lock_spid

=

1

Begin

Declare

@SPID

VARCHAR

(

10

), @ Mark

VARCHAR

(

10

)

While

@i

<=

@count

Begin

SELECT

@SPID

=

Process ID, @ logo

=

Sign

From

#T #T #T

WHERE

id

=

@i

insert

# T1

EXEC

(

'

DBCC INPUTBUFFER

'

@SPID

'

)

'

)

IF

@@ rowcount

=

0

insert

# T1 (a)

Values

(

NULL

)

IF

@ 标志

=

'

Deadlock process

'

EXEC

(

'

Kill

'

@SPID)

set

@i

=

@i

1

end

end

Else

While

@i

<=

@count

Begin

SELECT

@S

=

'

DBCC INPUTBUFFER

'

CAST

(Process ID

AS

VARCHAR

)

'

)

'

From

#T #T #T

WHERE

id

=

@i

insert

# T1

EXEC

(@S)

IF

@@ rowcount

=

0

insert

# T1 (a)

Values

(

NULL

)

set

@i

=

@i

1

end

SELECT

a.

*

SQL statement for the process

=

B. EventInfo

From

#t a

Join

# T1 B

on

A.ID

=

B.ID

ORDER

BY

Process ID

end

set

Nocount

Off

Go

IF

exists

(

SELECT

*

From

DBO.SYSOBJECTS

WHERE

id

=

Object_id

(N

'

[dbo]. [sp_who_lock]

'

)

and

ObjectProperty

(ID, N

'

ISPROCEDURE

'

)

=

1

)

Drop

Procedure

[

DBO

]

.

[

SP_WHO_LOCK

]

Go

/ ************************************************** ************************** // creation: fengyu mail: Maggiefengyu@tom.com Date: 2004-04-30 // Modification: from Http://www.9cbs.net/develop/read_article.asp?id=26566 Learn and rewrite // Description: View database blocked and deadlock situation ************** *********************************************************** ********** / USE

Master

Go

Create

Procedure

SP_WHO_LOCK

AS

Begin

Declare

@SPID

int

, @BL

int

, @Inttransactioncountonentry

int

@Introwcount

int

@Intcountproperties

int

@Intcounter

int

Create

TABLE

#tmp_lock_who (id)

int

Identity

(

1

,

1

), SPID

Smallint

, BL

Smallint

)

IF

@@ error

<>

0

Return

@@ error

insert

INTO

#TMP_LOCK_WHO (SPID, BL)

SELECT

0

, Blocked

From

(

SELECT

*

From

Sysprocesses

WHERE

Blocked

>

0

) A

WHERE

NOT

exists

(

SELECT

*

From

(

SELECT

*

From

Sysprocesses

WHERE

Blocked

>

0

) B

WHERE

a.blocked

=

SPID)

union

SELECT

SPID, Blocked

From

Sysprocesses

WHERE

Blocked

>

0

IF

@@ error

<>

0

Return

@@ error

-

Find the number of records of the temporary table

SELECT

@intcountproperties

=

Count

(

*

), @ Intcounter

=

1

From

#tmp_lock_who

IF

@@ error

<>

0

Return

@@ error

IF

@intcountproperties

=

0

SELECT

'

There is no blocking and deadlock information now

'

AS

Message

-

Cycle start

While

@intcounter

<=

@intcountproperties

Begin

-

Take the first record

SELECT

@SPID

=

SPID, @ BL

=

BL

From

#tmp_lock_who

WHERE

Id

=

@intcounter

Begin

IF

@SPID

=

0

SELECT

'

The database is deadlock is:

'

CAST

(@BL

AS

VARCHAR

(

10

))

'

The process number, the SQL syntax of its execution is as follows

'

Else

SELECT

'Process number SPID:

'

CAST

(@SPID

AS

VARCHAR

(

10

))

'

Be

'

'

Process number SPID:

'

CAST

(@BL

AS

VARCHAR

(

10

))

'

Block, the SQL syntax executed by its current process is as follows

'

DBCC

InputBuffer (@BL)

end

-

Circulating pointer down

set

@intcounter

=

@intcounter

1

end

Drop

TABLE

#tmp_lock_who

Return

0

end

转载请注明原文地址:https://www.9cbs.com/read-52259.html

New Post(0)