Из дедартных документов говорится, что:
Обратите внимание, что запись данных в объект OracleLob приводит к немедленной передаче данных на сервер.
Но он не упоминает, как это работает. Например, в следующем примере (из документов):
public void UploadBlob(OracleConnection myConnection)
{
FileStream fs = new FileStream("D:\\Tmp\\_Water.bmp", FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
myConnection.Open();
OracleLob myLob = new OracleLob(myConnection,OracleDbType.Blob);
int streamLength = (int)fs.Length;
myLob.Write(r.ReadBytes(streamLength), 0, streamLength);
OracleCommand myCommand = new OracleCommand("INSERT INTO Pictures (ID, PicName, Picture) VALUES(1,'Water',:Pictures)", myConnection);
OracleParameter myParam = myCommand.Parameters.Add("Pictures", OracleDbType.Blob);
myParam.OracleValue = myLob;
try
{
Console.WriteLine(myCommand.ExecuteNonQuery() + " rows affected.");
}
finally
{
myConnection.Close();
r.Close();
fs.Close();
}
}
... тогда, согласно документам, данные должны быть отправлены на сервер базы данных в строке myLob.Write(r.ReadBytes(streamLength), 0, streamLength);
- но на данный момент база данных не знает, в какой "записи" должен храниться blob, поэтому я немного сомневаюсь в том, как это работает на самом деле - где записаны данные? Есть ли какая-то промежуточная область памяти, в которую поступают данные, и в зависимости от того, я совершил или откатился, данные становятся доступными в конкретной записи (или удаляются при откате)?
LOB считается временным, если он не имеет ссылок на таблицы на сервере. Временные LOB используются для вставки новых данных в таблицы.
Обратите внимание, что временные LOB уничтожаются при совершении транзакции.
И затем, из документов оракула
Управление временными LOB
База данных отслеживает временные LOB в каждом сеансе и предоставляет av $ view, называемый v $ tempor_lobs. Из сеанса приложение может определить, какой пользователь владеет временным LOB. В качестве администратора базы данных вы можете использовать это представление для мониторинга и руководства по любой аварийной очистке временного пространства, используемого временными LOB.
Управление временным табличным пространством для временных LOB
Временное табличное пространство используется для хранения временных данных LOB. В качестве администратора базы данных вы управляете ресурсами хранения данных для временных данных LOB, контролируя доступ пользователей к временным табличным пространствам и создавая различные временные табличные пространства.
Итак, когда вы вставляете, вы пишете во временное табличное пространство. Когда вы совершаете транзакции, Oracle копирует эти данные в "свое место" (обычно это сегмент LOB в некотором табличном пространстве, но для коротких объектов LOB он может просто хранить его в строке с другими данными строки).