刚入门数据库系统。
有个并发控制的问题请教大家。
W3(D)W1(F)R1(D)W2(F)R2(G)W3(G)C1C2C3
这里出现了死锁,请问是怎么出现的呢?请帮我解释解释,非常感谢!
最好附图哦,感谢!

解决方案 »

  1.   

    自己搞懂啦,附上答案。
    T1须等待T3,T3须等待T2,T2须等待T1.这样就形成了一个大的循环。
      

  2.   

    1. 阻塞演示
    -- 1. 连接A-- 建立演示环境
    USE tempdbCREATE TABLE dbo.tb(
    id int)
    GO-- 开启事务并插入数据
    BEGIN TRAN
    INSERT dbo.tb(
    id)
    VALUES(
    1)
    --COMMIT TRAN
    GO-- 2. 连接B
    USE tempdbSELECT * FROM dbo.tb
    GO-- 删除演示环境
    DROP TABLE dbo.tb
    GO2、死锁演示
    -- 死锁演示-- 1. 连接A
    -- 建立测试环境
    USE tempdb
    GOCREATE TABLE dbo.tb(
    id int)
    INSERT dbo.tb(
    id)
    VALUES(
    1)
    GO-- 数据处理
    SET DEADLOCK_PRIORITY LOW -- NORMAL
    BEGIN TRAN
    SELECT * FROM dbo.tb WITH(HOLDLOCK)
    WAITFOR DELAY '00:00:05'
    UPDATE dbo.tb SET id = 2
    COMMIT TRAN
    GO
    -- 连接B
    USE tempdb
    GOBEGIN TRAN
    SELECT * FROM dbo.tb WITH(HOLDLOCK) UPDATE dbo.tb SET id = 2
    COMMIT TRAN
    GO-- 删除演示环境
    DROP TABLE dbo.tb
    GO
      

  3.   

    2个人同时看中一件货物。先判断谁先要买。是否买了。A先进行操作,假如A买了,则数据库记录更新了即为NEW,然后B这时候也在看记录 但是是旧的记录也就是OLD,这时候 保留住OLD,然后B要进行操作,就先进行比较OLD跟NEW值是否一样。不一样再提示给B 看是否要强制修改或者不允许修改。