Я недавно обнаружил в нашей базе данных Sybase на работе таблицу, в которой используется столбец типа «метка времени». Если я создам таблицу, используя этот таинственный тип данных с меткой времени вроде этого
create table dropme (
foo timestamp,
roo int null
)
insert into dropme (roo) values(123)
insert into dropme (roo) values(122)
insert into dropme (roo) values(121)
select * from dropme
go
Я получаю следующее из 'select * from dropme':
foo roo
-------------------- -----------
0x000100000e1ce4ea 123
0x000100000e1ce4ed 122
0x000100000e1ce509 121
0x000100000e1ce4ea не выглядит для меня очень меткой времени. Кроме того, я вижу этот вывод из 'sp_help timestamp':
Type_name Storage_type Length Prec Scale Nulls Default_name Rule_name Access_Rule_name Identity
--------- ------------ ------ ---- ----- ----- ------------ --------- ---------------- ----------
timestamp varbinary 8 NULL NULL 1 NULL NULL NULL NULL
Что, черт возьми, такое временная метка?
Тип данных временной метки определен as
varbinary(8) null
Имеет ли это какое-либо отношение ко времени или дате?
Нет. Название было выбрано неудачно.
Могу ли я преобразовать его в дату и время?
Нет.
Если это не время и не дата, для чего вы это используете?
Каждый раз, когда вставляется или обновляется строка со столбцом с меткой времени, столбец с меткой времени обновляется автоматически. Обратите внимание, что на самом деле существует два типа временных меток. TIMESTAMP
и CURRENT TIMESTAMP
. Разница в том, что CURRENT TIMESTAMP
устанавливается только при вставке.
Документация Sybase на этом остановилась, и я задумался, почему, черт возьми, кто-то когда-либо использовал временную метку типа данных. К счастью, я нашел несколько других обсуждений и пришел к выводу, что они используются при реализации оптимистичного управления параллелизмом.
Управление параллелизмом - это метод обеспечения того, чтобы несколько транзакций могли выполняться в одно и то же время или примерно в одно и то же время и по-прежнему приводить к правильным данным. Оптимистическое управление параллелизмом - это метод управления параллелизмом, который предполагает, что несколько транзакций могут выполняться без взаимного вмешательства. Т.е. никакой блокировки не требуется. Википедия описывает следующий алгоритм:
Тип данных временной метки Sybase может быть используется в шагах 1 и 3 этого алгоритма вместо использования даты / времени. Но мне не кажется, что это избавляет вас от лишней работы при использовании типа данных datetime. Я полагаю, это могло бы работать лучше.
Допустим, вы загружаете данные в свое приложение. После того, как вы что-то сделали, вы хотите убедиться, что эта запись была изменена, пока вы не получите (на низком уровне!)?
В этом случае у вас должен быть столбец TIMESTAMP. Сначала вы должны сохранить этот столбец. Непосредственно перед обновлением данных вы должны сравнить каждое значение, чтобы убедиться.
Вот почему существует этот тип данных!