我有一个简单的问题:
sqlCount=" SELECT count(*)"+
" FROM mytable "+
" WHERE ID = ?"+
" AND CANCEL_DATE IS NULL"+
" AND LAST_NAME IS NOT NULL";
int count = jdbcTemplate.queryForObject(
sqlCount, new Object[] { id }, Integer.class);
从spring boot呼叫。
没有传入id为(150)的行。运行queryforobject时,变量计数显示为1,而从sql developer运行同一查询时,变量计数显示为0!!
这是怎么回事?我错过了什么?
1条答案
按热度按时间gwbalxhn1#
可能的原因
a) 您计算的是返回的行数(即1行),而不是返回的一行中的值
b) 您有一个未提交的insert事务,这意味着sqldeveloper无法看到它
但不管是什么情况,您的评论中说“在我做了检查之后,我继续插入行”,那么您的方法无论如何都需要重新访问。
“先查询是否存在,如果不存在则插入”的概念基本上是有缺陷的,除非通过适当的数据库约束或类似的锁定机制对其进行备份。否则,你会陷入这样的境地:
第1部分-检查是否存在,没有发现,我们没事,做插入。。。第2部分-检查是否存在,没有发现,我们没事,做插入。。。会话1-提交会话2-提交
瞧…当你只期望1的时候,你有一个值的多次出现。
如果确实定义了适当的唯一约束/索引,那么根本不需要进行计数检查,因为插入要么有效,要么作为副本被拒绝。代码更少,没有数据损坏的问题。