订单安全控制

2011/11/01 by Jinyang | Filed under 工作认真.
1. 订单表的时间戳字段应使用 systimestamp
timestamp 的秒片段(fractional seconds),就是秒向下的精度划分,默认为6,最大为9 ,设置字段类型为: timestamp(9)  即可 ,高精度的时间戳可以满足顺序记录订单的需求,毕竟一秒的订单数量大于1亿的可能性还是很小的 。
Timestamp(precision)precision是指timestamp的精度 ,取值0-9,默认为6,而timestamp的精度达到billion(十亿)分之一秒,是以11个字节存储

取值时测试了:
select systimestamp from dual;
select CURRENT_TIMESTAMP(9) from dual ;
select systimestamp(9) from dual;
systimestamp  得到的精度是6位, CURRENT_TIMESTAMP虽然可以指定到9位,但是最后3位一直是000,所以虽然数据库是9位,但是取值好像达不到这么高精度,不过6位也可以满足业务。
systimestamp(9) 和  CURRENT_TIMESTAMP(9) 一样的最后3位都是000
官方文档显示:
These are features in Oracl9i or later version.
CURRENT_TIMESTAMP and CURRENT_DATE give session timestamp/date.
SYSTIMESTAMP and SYSDATE give databse date.
The two obviously may be in different timezones.

2. 同一用户的订单间隔必须大于10秒
insert语句的where条件增加以下逻辑:
10<(select  (to_date(TO_CHAR(systimestamp,’yyyy-mm-dd hh24:mi:ss’),’yyyy-mm-dd hh24:mi:ss’)   -
(select to_date(to_char(recordtime,’yyyy-mm-dd hh24:mi:ss’),’yyyy-mm-dd hh24:mi:ss’)
from 订单表
where 订单编号= (select max(订单编号)
from 订单表
where 用户= ‘用户编号’))) * 86400  from dual)
在订单表做触发器时,触发器是不允许读取自己的本表的数据来做判断的,这里可以读取其他和订单关联的表来做时间的判断。

Leave a Reply

Your email address will not be published. Required fields are marked *

返回顶部