Share via


FILESTREAM uygulamalarında veritabanı işlemleri ile çatışmaları önlemek

Kullanan uygulamalar **SqlOpenFilestream()**okuma veya yazma FILESTREAM blob verileri için Win32 dosya tanıtıcıları açmak için çakışma hatalarıyla karşılaşabilirsiniz Transact-SQLortak bir hareket içinde yönetilen deyimleri. Bu Transact-SQLya da mars sorguları yürütme tamamlamak için uzun bir zaman alacak. Uygulamaları gerekir özenle tasarlanmış bu tür çakışmaları önlemek için.

Ne zaman SQL Server Veritabanı Altyapısıveya FILESTREAM BLOB, açmaya çalıştığınızda uygulama Veritabanı Altyapısıilişkili işlem içeriği denetler. Veritabanı Altyapısıİzin verir veya vermez mi açma işlemi dml deyimleri ddl deyimleri ile çalışma, veri alma veya hareketlerini yönetme temel isteği. Aşağıdaki tablo gösterir nasıl Veritabanı Altyapısıbelirler olup bir Transact-SQLifade reddedilecek göre hareket açık olan dosyalar tür.

Transact-SQL deyimleri

Okuma için açılan

Yazma için açılan

create table, create INDEX, drop table ve alter table gibi veritabanı meta çalışmak ddl deyimleri.

İzin verilen

Engellenen ve bir zaman aşımı ile başarısız.

update, delete ve INSERT gibi veritabanında depolanan verilerle çalışmak dml deyimlerini.

İzin verilen

Reddedildi

SEÇİN

İzin verilen

İzin verilen

TAMAMLAMA HAREKET

Reddedilen *

Reddedilen *.

HAREKET KAYDETME

Reddedilen *

Reddedilen *

GERİ ALMA

İzin *

İzin *

* İşlem iptal edilir ve hareket bağlamı için açık tanıtıcıları geçersiz. Uygulama tüm açık tanıtıcıları kapatmanız gerekir.

Örnekler

Aşağıdaki örneklerde nasıl Transact-SQLdeyimleri ve FILESTREAM Win32 erişim çakışmalara neden olabilir.

A.FILESTREAM blob yazma erişimi için açma

Aşağıdaki örnek dosya yalnızca yazma erişimi için açma etkisini gösterir.

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.FILESTREAM blob okuma erişimi için açma

Aşağıdaki örnek dosya yalnızca okuma erişimi için açma etkisini gösterir.

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.Açılış ve kapanış çok FILESTREAM blob dosyaları

Birden fazla dosya açıksa, en kısıtlayıcı kural kullanılır. Aşağıdaki örnek, iki dosya açılır. İlk dosyayı okuma ve yazmak için ikinci açılır. İkinci dosya açılana kadar dml deyimlerini reddedilecektir.

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.Bir imleç kapatmak için başarısız

Aşağıdaki örnek bir deyimi imleç kapalı değil nasıl önleyebilirsiniz gösterir OpenSqlFilestream()blob yazma erişimi açmasını.

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.

Ayrıca bkz.

Başvuru

Erişim FILESTREAM veri ile OpenSqlFilestream

Kavramlar

Çoklu Active sonucu kullanarak (mars) ayarlar