数据库如何实现先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语句
如果是sqlserver:
(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 SHARE
或SELECT FOR KEY SHARE
这些行将被阻止,直到 当前交易结束;相反,SELECT FOR UPDATE
将 等待已运行任何这些命令的并发事务 在同一行上,然后将锁定并返回更新的行(或不 行,如果该行已被删除)。在REPEATABLE READ
或SERIALIZABLE
事务,但是如果一行会抛出错误 自事务开始后,待锁定已更改。为了更进一步的 讨论见第 13.4 节。
您的问题的直接答案是 Postgres 不能“立即”锁定所有行;它必须首先找到它们。请记住,这是行级锁定而不是表级锁定。
文档包括此注释:
SELECT FOR UPDATE
修改选定的行以将它们标记为锁定,因此 将导致磁盘写入。
我将其解释为 Postgres 执行 SELECT
查询并在找到行时将它们标记为已锁定。当 Postgres 识别该行时,锁(对于给定的行)开始。它一直持续到交易结束。
基于此,我认为使用SELECT FOR UPDATE
可能会出现死锁情况。
【讨论】:
以上是关于数据库如何实现先update 然后select的主要内容,如果未能解决你的问题,请参考以下文章
sql 需要先用select 查找到表中相应的记录 在update 批量修改 如何实现