数据库如何实现先update 然后select

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库如何实现先update 然后select相关的知识,希望对你有一定的参考价值。

update LZ_COUNT_SOURCES_yue set CNS_DIAL_NUMBER = cishu
set CNS_LAST_CALL = zhthsj
select max(a.CAL_CALL_DATE_TIME) as zhthsj,COUNT(*) as cishu from LZ_CALL_LOG a
where CAL_CONNECT_TIME_LEN > 0 and CAL_CALL_DIRECT = 2

怎么合并成为一个sql语句

参考技术A

如果是sqlserver:


update LZ_COUNT_SOURCES_yue  set CNS_DIAL_NUMBER = aaa.cishu                                                           set CNS_LAST_CALL = aaa.zhthsjfrom
(select max(a.CAL_CALL_DATE_TIME) as zhthsj,COUNT(*) as cishu from LZ_CALL_LOG a) aaa
where CAL_CONNECT_TIME_LEN > 0 and CAL_CALL_DIRECT = 2

本回答被提问者和网友采纳
参考技术B 感觉触发器可以的,更新完执行查询追问

什么意思,要先写个触发器的语句么

追答

应该是,好像以前接触发器,是更改数据时,向另外一行表中查更改时间的,数据信息的!感觉和你的有点像!都忘记了!你上网找找触发器

参考技术C 可以写个事务!事务的具体语法可百度!

select for update 如何适用于具有多行/结果的查询?

【中文标题】select for update 如何适用于具有多行/结果的查询?【英文标题】:How select for update works for queries with multiple rows/results? 【发布时间】:2016-07-19 04:29:08 【问题描述】:

所以考虑到这笔交易:

select * from table_a where field_a = 'A' for update;

假设这给出了多行/结果,数据库会立即锁定所有结果吗?还是一次将其锁定一排。

如果后者为真,这是否意味着同时运行此查询会导致死锁?

那么,需要添加一个order by来保持订单的一致性来解决这个问题吗?

【问题讨论】:

【参考方案1】:

documentation 解释如下发生的事情:

更新

FOR UPDATE 使SELECT 语句检索到的行变为 像更新一样被锁定。这可以防止它们被锁定, 被其他事务修改或删除,直到当前 交易结束。也就是其他尝试UPDATE的事务, DELETE, SELECT FOR UPDATE, SELECT FOR NO KEY UPDATE, SELECT FOR SHARESELECT FOR KEY SHARE 这些行将被阻止,直到 当前交易结束;相反,SELECT FOR UPDATE 将 等待已运行任何这些命令的并发事务 在同一行上,然后将锁定并返回更新的行(或不 行,如果该行已被删除)。在REPEATABLE READSERIALIZABLE事务,但是如果一行会抛出错误 自事务开始后,待锁定已更改。为了更进一步的 讨论见第 13.4 节。

您的问题的直接答案是 Postgres 不能“立即”锁定所有行;它必须首先找到它们。请记住,这是行级锁定而不是表级锁定。

文档包括此注释:

SELECT FOR UPDATE 修改选定的行以将它们标记为锁定,因此 将导致磁盘写入。

我将其解释为 Postgres 执行 SELECT 查询并在找到行时将它们标记为已锁定。当 Postgres 识别该行时,锁(对于给定的行)开始。它一直持续到交易结束。

基于此,我认为使用SELECT FOR UPDATE可能会出现死锁情况。

【讨论】:

以上是关于数据库如何实现先update 然后select的主要内容,如果未能解决你的问题,请参考以下文章

sql 需要先用select 查找到表中相应的记录 在update 批量修改 如何实现

如何实现在表单select中输入文字

SQLServer并发问题,先SELECT后UPDATE,避免并发脏读情况解决

mysql数据库百万级以上数据,如何对其进行边查询变更新?

mysql如何实现先查询后更新的sql语句

select for update 如何适用于具有多行/结果的查询?