Win32 i konfliktów Transact-SQL
Aplikacje używające SqlOpenFilestream() otworzyć dojścia do plików Win32 do odczytu lub zapisu danych typu BLOB FILESTREAM można napotkać błędy konflikt z Transact-SQL instrukcji, które są zarządzane w typowych transakcji.Obejmuje to Transact-SQL lub MARS kwerendy, które trwać bardzo długo czas na zakończenie realizacji. Aplikacji muszą być starannie zaprojektowane aby uniknąć tego typu konflikty.
Gdy Aparat baz danych programu SQL Server lub aplikacje, spróbuj otworzyć bloków BLOB FILESTREAM, Aparat baz danych sprawdza kontekst transakcji skojarzony. Aparat baz danych Zezwala lub odrzuca żądanie, w zależności od tego, czy operacja otwierania działa z instrukcja DDL DML instrukcja, pobieranie danych lub Zarządzanie transakcjami. Tabela poniżej zawiera jak Aparat baz danych Określa, czy Transact-SQL instrukcja będzie dozwolone lub odrzucone na podstawie typu plików, które są otwarte w transakcji.
Instrukcje języka Transact-SQL |
Otwarty do odczytu |
Otwarty do zapisu |
---|---|---|
Instrukcje DDL, które działają z metadane baz danych, takich jak CREATE TABLE, CREATE INDEX, DROP TABLE i ALTER TABLE. |
Dozwolone |
Są zablokowane i nie powiedzie się z czas-limit. |
DMLinstrukcje, które pracy z danymi przechowywanymi w bazie danych, takie jak aktualizacja, usuwanie i wstawianie. |
Dozwolone |
Odmowa dostępu |
WYBIERZ |
Dozwolone |
Dozwolone |
ZATWIERDZENIA TRANSAKCJI |
Odmowa dostępu * |
Odmowa dostępu *. |
ZAPISYWANIE TRANSAKCJI |
Odmowa dostępu * |
Odmowa dostępu * |
WYCOFYWANIE |
Dozwolone * |
Dozwolone * |
* Anulowane transakcji i otwarte dojścia kontekstu transakcji są unieważnione.Wniosek należy zamknąć wszystkie otwarte dojścia.
Przykłady
W następujących przykładach pokazano sposób Transact-SQL instrukcji i FILESTREAM Win32 dostępu mogą powodować konflikty.
A.Otwieranie BLOB FILESTREAM do zapisu
Poniższy przykład przedstawia wynik Otwieranie pliku tylko do zapisu.
dstHandle = OpenSqlFilestream(dstFilePath, Write, 0,
transactionToken, cbTransactionToken, 0);
//Write some date to the FILESTREAM BLOB.
WriteFile(dstHandle, updateData, …);
//DDL statements will be denied.
//DML statements will be denied.
//SELECT statements will be allowed. The FILESTREAM BLOB is
//returned without the modifications that are made by
//WriteFile(dstHandle, updateData, …).
CloseHandle(dstHandle);
//DDL statements will be allowed.
//DML statements will be allowed.
//SELECT statements will be allowed. The FILESTREAM BLOB
//is returned with the updateData applied.
B.Otwieranie BLOB FILESTREAM do odczytu
Poniższy przykład przedstawia wynik Otwieranie pliku tylko do odczytu.
dstHandle = OpenSqlFilestream(dstFilePath, Read, 0,
transactionToken, cbTransactionToken, 0);
//DDL statements will be denied.
//DML statements will be allowed. Any changes that are
//made to the FILESTREAM BLOB will not be returned until
//the dstHandle is closed.
//SELECT statements will be allowed.
CloseHandle(dstHandle);
//DDL statements will be allowed.
//DML statements will be allowed.
//SELECT statements will be allowed.
C.Otwieranie i zamykanie wiele plików FILESTREAM BLOB
Jeśli pliki są otwarte, używana jest reguła najbardziej restrykcyjne.Poniższy przykład otwiera dwóch plików.Pierwszy plik zostanie otwarty do odczytu, a drugi do zapisu.DMLinstrukcje zostaną odrzucone, aż do otwarcia drugiego pliku.
dstHandle = OpenSqlFilestream(dstFilePath, Read, 0,
transactionToken, cbTransactionToken, 0);
//DDL statements will be denied.
//DML statements will be allowed.
//SELECT statements will be allowed.
dstHandle1 = OpenSqlFilestream(dstFilePath1, Write, 0,
transactionToken, cbTransactionToken, 0);
//DDL statements will be denied.
//DML statements will be denied.
//SELECT statements will be allowed.
//Close the read handle. The write handle is still open.
CloseHandle(dstHandle);
//DML statements are still denied because the write handle is open.
//DDL statements will be denied.
//DML statements will be denied.
//SELECT statements will be allowed.
CloseHandle(dstHandle1);
//DDL statements will be allowed.
//DML statements will be allowed.
//SELECT statements will be allowed.
D.Niepowodzenie zamknąć kursor
W poniższym przykładzie pokazano, jak można zapobiec kursor instrukcja, który nie jest zamknięty OpenSqlFilestream() Otwieranie BLOB dla zapisu.
TCHAR *sqlDBQuery =
TEXT("SELECT GET_FILESTREAM_TRANSACTION_CONTEXT(),")
TEXT("Chart.PathName() FROM Archive.dbo.Records");
//Execute a long-running Transact-SQL statement. Do not allow
//the statement to complete before trying to
//open the file.
SQLExecDirect(hstmt, sqlDBQuery, SQL_NTS);
//Before you call OpenSqlFilestream() any open files
//that the Cursor the Transact-SQL statement is using
// must be closed. In this example,
//SQLCloseCursor(hstmt) is not called so that
//the transaction will indicate that there is a file
//open for reading. This will cause the call to
//OpenSqlFilestream() to fail because the file is
//still open.
HANDLE srcHandle = OpenSqlFilestream(srcFilePath,
Write, 0, transactionToken, cbTransactionToken, 0);
//srcHandle will == INVALID_HANDLE_VALUE because the
//cursor is still open.
Zobacz także