加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

逻辑:数据库或应用程序/ 2(约束检查)

发布时间:2021-03-08 08:09:36 所属栏目:MsSql教程 来源:网络整理
导读:这是 this question的特定版本. 我想检查是否插入了重复的行.我应该在我的应用程序层中以编程方式检查它: if (exists(obj)){ throw new DuplicateObjectException();}HibernateSessionFactory.getSession().save(obj); 或者我应该捕获数据库层引发的异常并在

这是 this question的特定版本.
我想检查是否插入了重复的行.我应该在我的应用程序层中以编程方式检查它:

if (exists(obj))
{
    throw new DuplicateObjectException();
}
HibernateSessionFactory.getSession().save(obj);

或者我应该捕获数据库层引发的异常并在违反约束时触发?

try
{
    HibernateSessionFactory.getSession().save(obj);
}
catch(ConstraintViolationException e)
{
    throw new DuplicateObjectException();
}

编辑:换句话说:虽然约束是保留的(无论如何它是好的数据库设计,我不能确定我的应用程序将是访问该表的唯一一个)我是否应该依赖约束并处理它的违规异常会提高,或者我最好还是检查一下?

EDIT2:我当然检查一个事务中的插入,锁定表以确保在此期间没有其他进程正在写另一个记录

解决方法

首先,您必须在数据库上具有主键或唯一约束才能正确实施此唯一性 – 毫无疑问.

鉴于存在约束,您应该在应用程序中编写哪种方式?我的偏好是尝试插入并捕获异常.因为大概大多数插入都会成功,只有少数会因为重复而失败(这就是“异常”所暗示的!):在数据库要执行自己的约束检查时,在每次插入之前执行存在检查是低效的.

此外,理论上可能存在检查错误 – 如果其他人设法在您的存在检查和插入之间的小间隔内提交具有相同键值的记录.然后,如果您没有捕获数据库异常,您将相信插入成功,而事实上它没有.

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读