禁忌14:select for update 要带nowait
select ... for update 语句 对于保证事务的完整性很有必要,但在一个并发环境中,使用该语句的应用很可能会导致数据库锁甚至死锁,正确的做法是 select ... for update nowait,并且在获取锁失败时要有重新处理的机制。
禁忌15:批量任务要控制好事务提交的频度
在后台进程或存储过程处理大批量数据时,事务提交禁止单条提交或者全部完成后再提交,提交太频繁会产生过多的数据库日志,一次性提交容易导致回滚段不够等问题。建议使用 100、500 或者 1000 条提交的频度。
禁忌16:sequence使用注意
对于部分表的内部关键 ID 字段如流水号等使用 sequence 是个非常不错的主意,可以有效保障并发环境下这种序列号分配的高效和唯一性。但在应用中使用sequence 时要注意几点:
长度设置要充分考虑业务发展的速度,有效序列在初期增长缓慢,但随着业务发展会迅速增长,因此开发设计时要进行充分的评估,防止出现 sequence很快被耗尽;
对于长期增长的序列号,最后采用时间戳 序列号的方式来作为字段值,防止序列号翻转;
序列号分配时,由于序列号在不同数据库实例的缓冲机制,可能会出现后面的数据记录序列号比前面插入记录序列号还要小的情况,因此序列号字段的值只能作为唯一键值使用,而不能作为业务排序的依据。
禁忌17:慎用rowid更新数据
rowid 是数据库记录的一个内部记录ID,使用 rowid 访问数据比普通索引还要高效,但如果在一个表的数据频繁插入、删除时,不要使用 rowid 来进行数据的操作,因为 Oracle 的 rowid 在数据有删除机制时,是有一定几率出现重复的。