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

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

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

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

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

但是玛丽一定有账户吗?即便她没有账户,最后的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个参数:付费人的名字、收款人的名字和付费金额。这个例子同时返回这次付费的
状态:

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

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

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

时间: 2024-11-10 07:41:06

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

服务器编程 如何把一个网页从服务器发送给客户机的浏览器

问题描述 服务器编程 如何把一个网页从服务器发送给客户机的浏览器 我把网页代码直接放到buf中用write(sockfd,buf,buf_size)发送过去 浏览器只会闪一下网页的代码然后一直转圈链接 而不是打开主页的形式 请问该怎么写才能让浏览器打开主页 这是我的测试网页内容 通过以下方式写入write_buf int f=open(index.html,O_RDONLY); write_buf[WRITE_BUFFER_SIZE-1]='n'; int tmp=read(f,write_bu

《PostgreSQL服务器编程》一一2.6 过程化语言

2.6 过程化语言 SQL Server允许你使用任何产生CLR的语言来创建DLL.这些DLL必须在启动的时候被加载到服务器里面.为了在运行时间创建一个程序,并且使它立即可用,唯一的选择就是内建的SQL方言--Transact SQL(TSQL). MySQL有一个叫做插件的功能.其中一种合法的插件类型是过程化语言.几种语言完成加工后,借由插件系统可以和MySQL一起工作.这些语言包括了最流行的几种语言,比如PHP.Python等.这些函数不能被用在存储过程与触发器中,但是它们可以被普通SQL语

《PostgreSQL服务器编程》一一1.10 总结——为什么在服务器中进行程序设计

1.10 总结--为什么在服务器中进行程序设计 我们在服务器端完成大部分数据操作编程工作,主要优势有以下几点.1.10.1 性能我们进行基于数据的计算几乎总是性能为王,也就是,我们会努力使获得数据的时间周期变得更短.通常在一个典型的数据密集型计算中,我们的大多数时间都集中花费在获得数据上.因此,在计算中,如何使数据访问变得更快就是使整个计算过程变得更高效的最好方法.在我的笔记本电脑上,从100000行记录的数据库中,随机查询一行并返回客户端需要花费2.2ms,但是在数据库内部获取数据,这个操作仅

《PostgreSQL服务器编程》一一导读

前 言 PostgreSQL服务器远远不只是一台数据库服务器.实际上,PostgreSQL甚至可以承担起一个应用程序开发框架的角色,这个框架的优势在于其具备事务支持.大量数据存储.日志记录.系统恢复等功能,以及PostgreSQL引擎提供的许多优秀特性.在蓬勃发展的商业化时代,如果你掌握了足够的PostgreSQL相关知识,你将有能力满足当前人才市场对高级PostgreSQL技能的强烈需求. 本书将带你学习PostgreSQL函数基础知识.在学习过程中,你将会使用各种程序语言(不限于自带的PL/

《PostgreSQL服务器编程》一一第1章 PostgreSQL服务器简介

第1章 PostgreSQL服务器简介 如果你认为PostgreSQL服务器仅仅是一个存储系统,和它交流的唯一办法就是通过SQL语句,那么你就严重了低估了它的特性.这仅仅是这个数据库的特性之一.PostgreSQL服务器是个强大的架构,它可以用来完成各种各样的数据处理,甚至包括一些非数据服务器的工作.它是一个服务器平台,你可以在这个平台上对各种流行的编程语言开发的函数或库进行简单的组合与匹配.我们来看一下这种复杂的多语言工作顺序:1)调用以Perl编写的字符串解析函数.2)把字符串转换成XSLT

COM编程入门第二部分——深入COM服务器

本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口.继上一篇COM编程入门之后,本文将讨论有关 COM服务器的内容,解释编写自己的COM接口和COM服务器所需要的步骤和知识,以及详细讨论当COM库对COM服务器进行调用时,COM服务器运行的 内部机制. 如果你读过上一篇文章.应该很熟悉COM客户端是怎么会事了.本文将讨论COM的另一端--COM服务器.内容包括如何用C++编写一个简单的不涉及 类库的COM服务器.深入到创建COM服务器的内部过程,毫无遮掩

Java网络服务器编程(NIO版)

编程|服务器|网络 从Java 1.4开始提供的NIO API常用于开发高性能网络服务器,本文演示了如何用这个API开发一个TCP Echo Server.   Java网络服务器编程 一文演示了如何使用Java的Socket API编写一个简单的TCP Echo Server.其阻塞式IO的处理方式虽然简单,但每个客户端都需要一个单独的Thread来处理,当服务器需要同时处理大量客户端时,这种做法不再可行.使用NIO API可以让一个或有限的几个Thread同时处理连接到服务器上的所有客户端.

Java的网络编程:用Java实现Web服务器

web|web服务|web服务器|编程|网络 超文本传输协议(HTTP)是位于TCP/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一,同样,HTTP 也是基于 C/S 或 B/S 模型实现的.事实上,我们使用的浏览器如Netscape 或IE 是实现HTTP 协议中的客户端,而一些常用的Web 服务器软件如Apache.IIS 和iPlanet Web Server 等是实现HTTP 协议中的服务器端.Web 页由服务端资源定位,传输到浏览器,经过浏览器的解释后,被客户所看

Android编程之客户端通过socket与服务器通信的方法

  Android编程之客户端通过socket与服务器通信的方法        本文实例讲述了Android编程之客户端通过socket与服务器通信的方法.分享给大家供大家参考,具体如下: 下面是一个demo,Android客户端通过socket与服务器通信. 由于Android里面可以完全使用java.io.*包和java.net.*包,那么,实际上,逻辑部分与J2SE没有区别.只是UI代码不一样. Android客户端通过socket与服务器通信分为下面5步: (1)通过IP地址和端口实例化