Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Filestream и репликация  [new]
BnUser
Guest
Господа, возникла проблема.
Есть БД с Filestream Microsoft SQL Server 2008 R2 (SP1) - 10.50.2550.0 (Intel X86)


Файлы заливаются через .net приложение известным способом:
+

//...
 using (SqlTransaction tran = connection.BeginTransaction(IsolationLevel.ReadCommitted))
                          {
//...
 command.CommandText = @"SELECT TOP(1) GET_FILESTREAM_TRANSACTION_CONTEXT()");

                                    byte[] transactionContext;
                                    using (SqlDataReader reader = command.ExecuteReader())
                                    {
                                        reader.Read();
                                        transactionContext = reader.GetSqlBytes(0).Buffer;
                                        reader.Close();

                                    }
                                    using (
                                        Stream fileStream = new SqlFileStream(filepathOnServer, transactionContext, FileAccess.Write))
                                    {
                                        var buffer = new byte[4194304];
                                        int bytes;
                                        while ((bytes = localFileStream.Read(buffer, 0, 4194304)) > 0)
                                        {
                                            fileStream.Write(buffer, 0, bytes);
                                        }
                                        fileStream.Close();
                                      [b]  tran.Commit();[/b]
                                    }
}



Все прекрасно работало, пока не настроил репликацию транзакциями => SQL Server 2012 Epress
Дистрибьютор 2008. Все изменения падают в 2008.

Репликация проходит прекрасно.

tran.Commit(); - стало выкидывать ошибку:
System.Data.SqlClient.SqlException (0x80131904):
An uncommittable transaction was detected at the beginning of the batch. The transaction was rolled back. This was caused by an error that occurred during the processing of a FILESTREAM request in the context of this transaction.

StackTrace, кому интересно:
+

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalTransaction.Commit()
at System.Data.SqlClient.SqlTransaction.Commit()


Почему спрашиваю в этом разделе.
Опытным путем было установлено, что процедура записи данных размером меньше 65536 байт (если я точно помню - это одна страница) проходит без ошибок. Если объем записываемых данных превышает это значение - валит эксепшн.

Причем откат транзакции тоже вызывает ошибку, мол транзакция не актуальна.
Интернеты по этой ошибке ничего путного не подсказали.

Убил репликацию - все опять отлично работает.

Есть подозрение, что при записи объема более одной страницы отрабатывает какой-то триггер, который уносит мою транзакцию.
Пробовал все уровни изоляции. Пробовал TransactionScope - ошибка одна и таже.


P.S. Конвертирование Filestream в nvarchar(max) при репликации отключено.
21 авг 13, 14:23    [14736224]     Ответить | Цитировать Сообщить модератору
 Re: Filestream и репликация  [new]
Glory
Member

Откуда:
Сообщений: 104751
max text repl size какое значение имеет ?
21 авг 13, 14:27    [14736269]     Ответить | Цитировать Сообщить модератору
 Re: Filestream и репликация  [new]
BnUser
Guest
65536
Охохох...
Поставлю -1
Чуть позже отпишу о результатах
21 авг 13, 14:53    [14736523]     Ответить | Цитировать Сообщить модератору
 Re: Filestream и репликация  [new]
BnUser
Guest
Спасибо. Все работает.
22 авг 13, 06:14    [14739308]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить