是这样,
首先得到符合条件的多行中的一行,
然后把该行中标志位字段置为1,
如果成功,提交事务,并返回该行一字段的值,
不成功则回滚可我在程序中执行sql语句正常却无法获得该字段值(在sql server分析器里面执行可以)
试了事务+存储过程也没成功,偶对数据库不太在行,请大侠指点大致的意思:
BEGIN TRAN zMDFC_TypeCode
DECLARE @V_VIPath VARCHAR(32)
SELECT TOP 1 @V_VIPath = VIPath FROM VIPool WHERE bFlag = 0
UPDATE VIPool SET bFlag = 1 WHERE VIPath = @V_VIPath
SELECT @V_VIPath
IF @@ERROR = 0
COMMIT TRAN zMDFC_TypeCode
IF @@ERROR <> 0
ROLLBACK TRAN zMDFC_TypeCode执行成功,返回为空。试了几次,发现如果没有UPDATE语句可以返回记录集。
首先得到符合条件的多行中的一行,
然后把该行中标志位字段置为1,
如果成功,提交事务,并返回该行一字段的值,
不成功则回滚可我在程序中执行sql语句正常却无法获得该字段值(在sql server分析器里面执行可以)
试了事务+存储过程也没成功,偶对数据库不太在行,请大侠指点大致的意思:
BEGIN TRAN zMDFC_TypeCode
DECLARE @V_VIPath VARCHAR(32)
SELECT TOP 1 @V_VIPath = VIPath FROM VIPool WHERE bFlag = 0
UPDATE VIPool SET bFlag = 1 WHERE VIPath = @V_VIPath
SELECT @V_VIPath
IF @@ERROR = 0
COMMIT TRAN zMDFC_TypeCode
IF @@ERROR <> 0
ROLLBACK TRAN zMDFC_TypeCode执行成功,返回为空。试了几次,发现如果没有UPDATE语句可以返回记录集。
所以不清楚你加事务想保障什么, 在默认的事务隔离级别下, 你加的事务是没有意义的.而且一般不会对select用事务, 事务一般主要用于保证数据处理(新增/修改/删除)的一致性.
SET NOCOUNT ON
BEGIN TRAN zMDFC_TypeCode
DECLARE @V_VIPath VARCHAR(32)
SELECT TOP 1 @V_VIPath = VIPath FROM VIPool WHERE bFlag = 0
UPDATE VIPool SET bFlag = 1 WHERE VIPath = @V_VIPath
SELECT @V_VIPath
IF @@ERROR = 0
COMMIT TRAN zMDFC_TypeCode
IF @@ERROR <> 0
ROLLBACK TRAN zMDFC_TypeCode
SET NOCOUNT OFF
应该是你的表里的就没有bflag的值就没有为0的。
比如
DECLARE @V_VIPath VARCHAR(32)
SELECT TOP 1 @V_VIPath = VIPath FROM VIPool WHERE bFlag = 0
UPDATE VIPool SET bFlag = 1 WHERE VIPath = @V_VIPath
如果执行完第二句后,还没来得及执行第三句,另外一个程序调用执行到
SELECT TOP 1 @V_VIPath = VIPath FROM VIPool WHERE bFlag = 0
会不会得到同样的VIPath
BEGIN TRAN zMDFC_TypeCode
DECLARE @V_VIPath VARCHAR(32)
SELECT TOP 1 @V_VIPath = VIPath FROM VIPool (UPDLOCK) -- 正确的方法, 加锁提示, 把锁保持到事务结束
WHERE bFlag = 0
UPDATE VIPool SET bFlag = 1 WHERE VIPath = @V_VIPath
SELECT @V_VIPath
IF @@ERROR = 0
COMMIT TRAN zMDFC_TypeCode
IF @@ERROR <> 0
ROLLBACK TRAN zMDFC_TypeCode
SET NOCOUNT OFF
REPEATABLE READ
SERIALIZABLE
这两种之一
多谢多谢楼上,以后多多指点!!