none
这种并发的情况怎么用“事故"控制呢??? RRS feed

  • 问题

  • “事故”控制的都是顺序执行的过程。

    比如:

           “过程1”、“过程2”、“过程3”、“过程4”、“过程5”、“过程6”是一起执行的,它们分别操作表T1、T2、T3、T4、T5、T6。也就是“要完成就一起完成”,“有一个完不成,其它的几个也不去执行”。   

    如果用一个“事故”包含“过程1”、“过程2”、“过程3”、“过程4”、“过程5”、“过程6”,那么他们必然是“顺序执行”的,也就是执行完“过程1”,然后执行“过程2”,接着是“过程3”。

    问题一:如果要并发,怎么办???


    用多线程的话:

         “过程1”、“过程2”、“过程3”、“过程4”、“过程5”、“过程6”这样的“6个线程”同时执行,如果“6个都成功那么结束”,如果有一个不成功,那么执行方法“删除操作的表T1、T2、T3、T4、T5、T6中”的数据。



    问题二:

    这样的情况用事故可以吗???    只能用程序控制吗???

    Science and technology is my lover.

    2012年11月7日 8:49

答案

  • (1)锁定资源,使事务保持隔离
    SQLSERVER通过在访问不同资源时需要申请不同类型锁的方式,实现了不同事务之间的隔离。
    如果两个事务会互相影响,那么在其中一个事务申请到了锁以后,另外一个事务就必须等待,
    直到前一个事务做完为止

    就是说你在每一个过程里做的操作 比如查询,修改,删除 都在事务里加上锁

    打个比方,有两个会话连接到SQLSERVER ,如果session1先到,session2后到,那么session2要等50秒才能访问同一条记录

    --session1
    USE [GPOSDB]
    BEGIN TRAN
    DELETE FROM [dbo].[SystemPara] WITH(ROWLOCK) WHERE [RecordNo]=10
    WAITFOR DELAY '00:00:50'
    COMMIT

    -------------------------------------------------------------------------------------------------------

    --session2
    USE [GPOSDB]
    BEGIN TRAN
    UPDATE [dbo].[SystemPara] WITH(ROWLOCK) SET [Name]='你好' WHERE [RecordNo]=10
    WAITFOR DELAY '00:00:50'
    COMMIT


    至于使用哪种类型的锁要自己判断了


    给我写信: QQ我:点击这里给我发消息

    • 已标记为答案 starrycheng 2012年11月12日 1:12
    2012年11月11日 14:28

全部回复

  • 你说的是事务?transaction?

    可以都用事务,然后发现有错误的,就全部回滚。


    想不想时已是想,不如不想都不想。

    2012年11月7日 14:45
    版主
  • 大师,

          过程一 ,操作表T1,如果用“transaction”,也只能回滚对表“T1”的操作。

          过程二,操作表T2,如果用“transaction”,也只能回滚对表“T2”的操作。

          过程一与过程二,要求并发。如果过程一执行成功,过程二执行失败,那么过程一与过程二都要回滚。   如果过程二执行成功,过程一执行失败,那么过程一与过程二也都要回滚。          这样的并发机制,transaction”可以实现吗???    怎样同时回滚过程一与过程二???


    Science and technology is my lover.



    2012年11月8日 0:55
  • BEGIN TRAN

    TRY

    过程1

    过程2

    COMMIT

    CATCH

    ROLLBACK

    不就可以了。

    2012年11月8日 1:23
  • 很遗憾,无法现实您的需求。
    如果您想多个过程并发执行,那就需要分别在多个session 里执行,因为同一个session中的多个过程是顺序执行的。
    而事务是无法跨越多个session的,所以无法现实您的需求。

     

    2012年11月8日 2:17
  • 不能“同时”回滚。但是为啥要同时?分别回滚事务1和事务2就是了。

    想不想时已是想,不如不想都不想。

    2012年11月8日 7:46
    版主
  • 数据要保证完整性啊?

    Science and technology is my lover.

    2012年11月8日 8:49
  • 完整性也不需要同时阿。一个事务里面,回滚对多个表的操作也不是同时的。


    想不想时已是想,不如不想都不想。

    2012年11月8日 9:37
    版主
  • jackie shen大侠 SQLSERVER有分布式事务


    给我写信: QQ我:点击这里给我发消息


    2012年11月9日 14:58
  • jackie shen大侠 SQLSERVER有分布式事务


    给我写信: QQ我:点击这里给我发消息



    桦仔别捣乱,分布式事务不是做这个用的,他这是同一个数据库。

    想不想时已是想,不如不想都不想。

    2012年11月10日 5:31
    版主
  • Hi 桦仔,

    他的要求是多个过程并发运行,这样的话,那就需要每个不同的过程运行在多个不同的session中,因为同一个session只能按顺序执行多个过程,

    并且他又要求那些过程在同一个事务中,而现实都成功或者都失败的功能,

    但是SQL SERVER中同一个事务是不能跨越多个session的,所以我说没有办法现实他的需求。



    2012年11月10日 6:32
  • jackishen大侠 你说得 有道理

    给我写信: QQ我:点击这里给我发消息

    2012年11月10日 7:55
  • 对于关系型数据库,不管是SQLSERVER还是ORACLE

    隔离性
    由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务识别数据所处的状态,
    要么是另一并发事务修改他之前的状态,要么是第二个事务修改他之后的状态,事务不会
    识别中间状态的数据。也就是说,虽然用户是在并发操作,但是,事务是串行执行的。
    对同一个数据对象的操作,事务读写修改是有先后顺序的。不是同一时间什么事情都能同时做的

    希望这段话能帮助LZ


    给我写信: QQ我:点击这里给我发消息

    2012年11月11日 14:09
  • (1)锁定资源,使事务保持隔离
    SQLSERVER通过在访问不同资源时需要申请不同类型锁的方式,实现了不同事务之间的隔离。
    如果两个事务会互相影响,那么在其中一个事务申请到了锁以后,另外一个事务就必须等待,
    直到前一个事务做完为止

    就是说你在每一个过程里做的操作 比如查询,修改,删除 都在事务里加上锁

    打个比方,有两个会话连接到SQLSERVER ,如果session1先到,session2后到,那么session2要等50秒才能访问同一条记录

    --session1
    USE [GPOSDB]
    BEGIN TRAN
    DELETE FROM [dbo].[SystemPara] WITH(ROWLOCK) WHERE [RecordNo]=10
    WAITFOR DELAY '00:00:50'
    COMMIT

    -------------------------------------------------------------------------------------------------------

    --session2
    USE [GPOSDB]
    BEGIN TRAN
    UPDATE [dbo].[SystemPara] WITH(ROWLOCK) SET [Name]='你好' WHERE [RecordNo]=10
    WAITFOR DELAY '00:00:50'
    COMMIT


    至于使用哪种类型的锁要自己判断了


    给我写信: QQ我:点击这里给我发消息

    • 已标记为答案 starrycheng 2012年11月12日 1:12
    2012年11月11日 14:28