Что такое таинственный тип данных «отметка времени» в Sybase?

Я недавно обнаружил в нашей базе данных 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

Мои вопросы

  1. Что это за отметка времени?
  2. Имеет ли она какое-либо отношение ко времени или дате?
  3. Могу ли я преобразовать ее в дату-время?
  4. Если это не время или дата , для чего вы его используете?
16
задан Eric Johnson 10 March 2015 в 16:42
поделиться

2 ответа

Что, черт возьми, такое временная метка?

Тип данных временной метки определен as

varbinary(8) null

Имеет ли это какое-либо отношение ко времени или дате?

Нет. Название было выбрано неудачно.

Могу ли я преобразовать его в дату и время?

Нет.

Если это не время и не дата, для чего вы это используете?

Каждый раз, когда вставляется или обновляется строка со столбцом с меткой времени, столбец с меткой времени обновляется автоматически. Обратите внимание, что на самом деле существует два типа временных меток. TIMESTAMP и CURRENT TIMESTAMP . Разница в том, что CURRENT TIMESTAMP устанавливается только при вставке.

Документация Sybase на этом остановилась, и я задумался, почему, черт возьми, кто-то когда-либо использовал временную метку типа данных. К счастью, я нашел несколько других обсуждений и пришел к выводу, что они используются при реализации оптимистичного управления параллелизмом.

Управление параллелизмом - это метод обеспечения того, чтобы несколько транзакций могли выполняться в одно и то же время или примерно в одно и то же время и по-прежнему приводить к правильным данным. Оптимистическое управление параллелизмом - это метод управления параллелизмом, который предполагает, что несколько транзакций могут выполняться без взаимного вмешательства. Т.е. никакой блокировки не требуется. Википедия описывает следующий алгоритм:

  1. Записать отметку даты / времени при запуске транзакции
  2. Прочитать / обновить данные
  3. Проверить, не изменила ли другая транзакция данные
  4. Принять или откатить

Тип данных временной метки Sybase может быть используется в шагах 1 и 3 этого алгоритма вместо использования даты / времени. Но мне не кажется, что это избавляет вас от лишней работы при использовании типа данных datetime. Я полагаю, это могло бы работать лучше.

16
ответ дан 30 November 2019 в 21:35
поделиться

Допустим, вы загружаете данные в свое приложение. После того, как вы что-то сделали, вы хотите убедиться, что эта запись была изменена, пока вы не получите (на низком уровне!)?

В этом случае у вас должен быть столбец TIMESTAMP. Сначала вы должны сохранить этот столбец. Непосредственно перед обновлением данных вы должны сравнить каждое значение, чтобы убедиться.

Вот почему существует этот тип данных!

1
ответ дан 30 November 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: