열이 ID
인 테이블이 있고 varchar (255) 및 done
비트가 있습니다. 첫 번째 ID
을 가져오고 싶습니다. 여기서 비트는 설정되지 않았고 페칭도 비트를 설정합니다. 따라서 스크립트의 다른 인스턴스는 동일한 ID
을 사용하며 경쟁 조건은 없습니다.MSSQL에서 한 번의 작업으로 업데이트 및 선택
import _mssql
con = _mssql.connect(server='server', user='user', password='password', database='default')
#these two in a single command
con.execute_query('SELECT TOP 1 ID FROM tableA WHERE done=0')
con.execute_query('UPDATE tableA SET done=1 WHERE ID=\''+id_from_above+'\'')
for row in con:
#row['ID'] contains nothing as it last used with the UPDATE, not the SELECT
start_function(row['ID'])
(wewesthemenace의 제안 포함)
편집 :
[...]
con.execute_query('UPDATE tableA SET done = 1 WHERE ID = (SELECT TOP 1 ID FROM tableA WHERE done = 0)')
for row in con:
#row['ID'] contains nothing as it last used with the UPDATE, not the SELECT
start_function(row['ID'])
마이크로 소프트 SQL 서버 엔터프라이즈 에디션 v9.00.3042.00에서 작업, 즉 SQL Server 2005 서비스 팩 2
편집 2 :
답변 된 질문은 다음 질문으로 연결됩니다. While mssql query returns an affected ID use it in a while loop
** 거래 ** 및 ** 행 잠금 **을 살펴보고 싶습니다. "execute_query()'에서 두 쿼리를 모두 처리하는 것은 쉽지 않습니다."_ solution (afaik). 내가 발견 한 좋은 소개는 ** [this technet article] (http://technet.microsoft.com/ko-kr/library/jj856598(v=sql.110).aspx) **이며, ** ACID ** etc. – funkwurm
하나의 execute_quer()를 사용하여 솔루션을 얻었습니다. 질문을 편집하고 지금 내 솔루션을 추가 할 것입니다. 그러나 링크에 대해 대단히 감사합니다. –