积极答复者
这种并发的情况怎么用“事故"控制呢???

问题
-
“事故”控制的都是顺序执行的过程。
比如:
“过程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.
答案
-
(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
至于使用哪种类型的锁要自己判断了
- 已标记为答案 starrycheng 2012年11月12日 1:12
全部回复
-
大师,
过程一 ,操作表T1,如果用“transaction”,也只能回滚对表“T1”的操作。
过程二,操作表T2,如果用“transaction”,也只能回滚对表“T2”的操作。
过程一与过程二,要求并发。如果过程一执行成功,过程二执行失败,那么过程一与过程二都要回滚。 如果过程二执行成功,过程一执行失败,那么过程一与过程二也都要回滚。 这样的并发机制,“transaction”可以实现吗??? 怎样同时回滚过程一与过程二???
Science and technology is my lover.
- 已编辑 starrycheng 2012年11月8日 0:57
-
Hi 桦仔,
他的要求是多个过程并发运行,这样的话,那就需要每个不同的过程运行在多个不同的session中,因为同一个session只能按顺序执行多个过程,
并且他又要求那些过程在同一个事务中,而现实都成功或者都失败的功能,
但是SQL SERVER中同一个事务是不能跨越多个session的,所以我说没有办法现实他的需求。
- 已编辑 Michael CS 2012年11月10日 6:34
-
(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
至于使用哪种类型的锁要自己判断了
- 已标记为答案 starrycheng 2012年11月12日 1:12