《PostgreSQL服务器编程》一一1.1 为什么在服务器中进行程序设计

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介:

本节书摘来自华章计算机《PostgreSQL服务器编程》一书中的第1章,第1.1节,作者:(美)Hannu Krosing, Jim Mlodgenski, Kirk Roybal 著
,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.1 为什么在服务器中进行程序设计

开发者使用各种不同的语言进行程序开发,并且希望所编写的代码能够在任何环境下运行。当编写应用程序的时候,一些程序员会坚守这样的信条:他们认为服务端应用程序里面的处理逻辑应尽可能多地被推送到客户端。因此,我们经常能见到这样一种情况,即越来越多的应用程序会在浏览器中使用JavaScript。还有的情况则是把处理逻辑放置在中间层,然后通过应用程序服务器来处理业务规则。这些实际上都是设计应用程序的各种有效方式,那么为什么还要在数据库服务器中进行程序设计呢?
让我们从一个简单的例子开始。许多应用程序会涉及一张客户列表,这些客户的账户中有账户余额。我们将使用这个示例模式和数据:
image

当我们使用数据库时,最常用的方式就是使用SQL查询和数据库进行交互。如果你想从Bob的账户转移14美元到Mary的账户,你可以通过简单的SQL语句实现:
image

但是,你要确保Bob的账户有足够的余额(或存款)。这样的确认非常重要,因为一旦出现任何事件节点的失败,就会导致事务不被触发。因此,考虑到这一点,在应用程序开发中,以上的代码片段就会变成这样:
image

但是玛丽一定有账户吗?即便她没有账户,最后的UPDATE语句仍然会成功,但是却更新了0行记录。如果核对出现失败状况,那么你应该做ROLLBACK,而不是COMMIT。一旦你按照这样的流程,对所有客户端完成了转账的任务,新的需求又会出现。也许这次需求是要求把最小的可转移金额限制为5美元,这时候你就需要再次检查所有客户端中的所有代码。
所以你是否可以做些什么,使得所有这些工作更加容易管理、更加安全和更加强健?这就是服务器程序设计可以做到的事情,它可以在自动在数据库服务器上执行代码。你可以把计算、核对和数据操作全部转移到一个位于服务器上的用户定义函数里面(UDF)。这样做不仅仅保证了你只需要管理一份操作逻辑,同时也使得工作更加快捷,因为此时你不再需要在服务器与客户端之间来回穿梭。如果需要的话,你甚至只需要确保仅仅是那些必需的信息被传送到数据库之外。比如,对于大多数客户端应用程序而言,它们并不需要知道Bob账户上究竟有多少余额。大多数情况下,这些客户端应用程序仅仅需要知道账户上是否有足够的余额可用于转账,或者更简明扼要一点,它们只需要了解这次交易是否可以成功,仅此信息足矣。
使用PL/pgSQL进行完整性检查
PostgreSQL有它自己的开发语言,叫做PL/pgSQL。PL/pgSQL的主要目的就是轻松地与SQL语句集成在一起。PL是programming language的简称,意思是程序设计语言。PL仅仅是诸多可用于服务器开发语言中的一种。而pgSQL则是PostgreSQL的缩写。
与基础SQL不同,PL/pgSQL包括了程序化的元素,比如在PL/pgSQL中可以使用if /then/else语句和循环功能。你可以轻松地执行SQL语句,甚至对SQL语句的结果进行循环操作。
应用程序中所需要进行的完整性检查可以通过PL/pgSQL函数来完成。这种函数包括了3个参数:付费人的名字、收款人的名字和付费金额。这个例子同时返回这次付费的
状态:
image

假设你在之前并未使用过先前建议的UPDATE语句,这里提供使用这个函数的一些
例子:image
image

该应用程序应该检查返回码,并且决定如何处理这些错误。只要程序设定了拒绝任何意外值,你就可以通过扩展这个函数,去做更多的检查工作,比如最小可转账金额,并确保这个可以避免执行。这里有3个可能会返回的错误:
image

为了使这些检查始终有效,你需要让所有的转账操作通过函数来执行,而不是手动使用SQL语句来改变这些值。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
20天前
|
存储 关系型数据库 MySQL
探索MySQL:关系型数据库的基石
MySQL,作为全球最流行的开源关系型数据库管理系统(RDBMS)之一,广泛应用于各种Web应用、企业级应用和数据仓库中
|
18天前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
|
18天前
|
关系型数据库 MySQL 网络安全
Mysql 数据库主从复制
在MySQL主从复制环境中,配置了两台虚拟机:主VM拥有IP1,从VM有IP2。主VM的`my.cnf`设置server-id为1,启用二进制日志;从VM设置server-id为2,开启GTID模式。通过`find`命令查找配置文件,编辑`my.cnf`,在主服务器上创建复制用户,记录二进制日志信息,然后锁定表并备份数据。备份文件通过SCP传输到从服务器,恢复数据并配置复制源,启动复制。检查复制状态确认运行正常。最后解锁表,完成主从同步,新用户在从库中自动更新。
992 7
Mysql 数据库主从复制
|
8天前
|
分布式计算 大数据 关系型数据库
MaxCompute产品使用合集之如何实现类似mysql实例中的数据库功能
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
9天前
|
消息中间件 DataWorks 关系型数据库
DataWorks产品使用合集之遇到无法连接到本地 MySQL 数据库的问题,该如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
10天前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
42 3
|
24天前
|
XML Java 关系型数据库
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
Action:Consider the following: If you want an embedde ,springBoot配置数据库,补全springBoot的xml和mysql配置信息就好了
|
23天前
|
关系型数据库 MySQL 数据库
关系型数据库mysql数据增量恢复
【7月更文挑战第3天】
138 2