当两个或多个事务互相阻塞时,就会发生死锁。例如,事务 A 需要访问表 B,但表 B 被事务 B 锁定。事务 B 需要访问表 A,但表 A 被事务 A 锁定。这时就发生循环阻塞冲突。
当返回 SQLCODE -306 和 -307 时,就明显表示发生死锁。为解决死锁,SQL Anywhere 会自动回退形成该死锁的最后一条语句。如果不断回退语句,则会出现性能问题。
本教程假定您已创建了测试数据库 app_profiling.db。
按照以下操作连接到 app_profiling.db:
在 Sybase Central 中,于 SQL Anywhere 12 插件内单击 [连接] » [使用 SQL Anywhere 12 连接]。
在 [连接] 窗口中,完成以下字段以连接到测试数据库 app_profiling.db。
验证 数据库
用户 ID DBA
口令 sql
操作 启动此计算机上的数据库
数据库文件 C:\AppProfilingTutorial\app_profiling.db
启动行 dbeng12 -x tcpip
单击 [连接]。
在左窗格中,单击 app_profiling - DBA,然后单击 [文件] » [打开 Interactive SQL]。
Interactive SQL 启动并连接到 app_profiling.db 数据库。
在 Interactive SQL 中:
执行以下 SQL 语句,创建两个随后将用于创建死锁的表:
CREATE TABLE "DBA"."deadlock1" ( "id" UNSIGNED BIGINT NOT NULL DEFAULT AUTOINCREMENT, "val" CHAR(1) ); CREATE TABLE "DBA"."deadlock2" ( "id" UNSIGNED BIGINT NOT NULL DEFAULT AUTOINCREMENT, "val" CHAR(1) ); |
执行以下 SQL 语句,在每个表中插入值:
INSERT INTO "deadlock1"("val") VALUES('x'); INSERT INTO "deadlock2"("val") VALUES('x'); |
执行以下 SQL 语句,创建两个随后将用于引发死锁的过程:
CREATE PROCEDURE "DBA"."proc_deadlock1"( ) BEGIN LOCK TABLE "DBA"."deadlock1" IN EXCLUSIVE MODE; WAITFOR DELAY '00:00:20:000'; UPDATE deadlock2 SET val='y'; END; CREATE PROCEDURE "DBA"."proc_deadlock2"( ) BEGIN LOCK TABLE "DBA"."deadlock2" IN EXCLUSIVE MODE; WAITFOR DELAY '00:00:20:000'; UPDATE deadlock1 SET val='y'; END; |
执行以下 SQL 语句,提交对数据库所做的更改:
COMMIT; |
关闭 Interactive SQL。
单击以下链接以继续本教程: 第 2 课:创建死锁并捕获与其相关的信息.
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |