论转帐业务的两种实现方式
要实现银行系统的转帐业务咋看很简单,无非就是转出的帐号减去转出的钱,转入的帐号加上转入的钱就行了。可是问题没有想象的那么简单,那么这里我就来说说银行转帐业务的大致流程。由于本人用的是Java语言,所以也就谈Java的方法,若有其他语言版本的同仁,此法仅供参考。
那么究竟是哪两种方式呢?
先介绍下数据库的表结构:用户表(用户ID、帐号、用户名)、操作表(操作表ID、操作业务类型、用户ID、操作日期)、操作明细表(明细表流水号、操作表ID、操作Money、操作说明(如转入/转出多少钱)、用户ID)。
一种是用纯Java OO的思想来完成转帐业务,所有的业务处理和事物控制过程全部在Java实现;另一种是用数据库实现(Oracle),业务处理和事物的控制权不都在数据库内实现——即用存储过程加函数。
下面我就这两种不同的方式做一个简单比较。
如果是第一种方式来实现转帐业务的话,那么肯定是用到经典的MVC模式,将整个系统分为模型-视图-业务控制等几个层,不用说大家都知道,模型层主要是一些简单的javabean,是和我们数据库想对应的一些简单Java对象,也就是我们每个表的Java抽象。视图层,顾名思义就是用来给用户展示数据信息的层,主要是一些jsp或者html等网页。当然,最难的是业务控制部分,在这部分,我们可能会有ActionServlet.java这个中央控制的Servlet类,还需要专门用于业务操作的Servicel类,以及数据持久化的Dao等众多类组成。其中又会抽象出很多的接口,这样是利于后期的维护与新的需求。加起来实现转帐业务的话大概需要10多个类,相对来说步骤比较繁琐,下面我们看看数据实现方式。
而如果用数据库(前提是用Oracle)来实现转帐业务的话,想对来说步骤没那么简单。但是与第一种方式同样重要的一点就是,开发人员必须对整个业务流程非常的熟悉,因为所有的业务我们会在一个存储过程中去完成,具体实现代码我会在下面贴出。而Java只需调用存储过程就能完成整个业务的流程控制,相对来说开发步骤少了很多,而Java也不需要写很多类和接口,但是这样会出现一个很大的弊端,就是后期的维护性很差。因为我们在一个存储过程中实现所有业务的话代码会相对较长,一般只有编写代码本人能够看懂,一旦出现问题,维护是就是一件很伤脑筋的事情。而Java OO实现的方式在维护上就轻松得多,就算业务有变更,因为我们之前有很多的接口,所以也不需要修改原有的代码便能增加新的业务,而第二种方式是不可能的,必须要修改存储过程的代码,而这又是一件头大的事情。所以大多数情况下企业还是会选择前面那种开发方式。那为什么还是有用第二种方式开发的呢,原因很简单,因为存储过程开发的话程序的运行效率要比前者高很多,所以在有的时候考虑到大数据量的时候,效率才是关键问题,这也是移动、电信开始想第二种方式靠拢的原因吧。
那么我们到底应该如何选取开发的方式呢?
下面仅供参考意见,如果业务经常有变更,或者说经常有新的业务需求的话,我觉得最好用第一种开发方式,因为这样便于维护。如果说业务相对较为固定而你又要求效率的话那么可以考虑后者。
下面是存储过程的代码:
CREATE OR REPLACE PROCEDURE SP_TRANSFER(P_ACCOUNT_OUT T_ACCOUNT.A_ACCOUNT%TYPE,
P_ACCOUNT_IN T_ACCOUNT.A_ACCOUNT%TYPE,
P_MONEY T_ACCOUNT.A_BALANCE%TYPE) AS
V_ACCOUNTCOUNT NUMBER(1);
V_BALANCE T_ACCOUNT.A_BALANCE%TYPE;
BEGIN
SELECT COUNT(A_ACCOUNT)
INTO V_ACCOUNTCOUNT
FROM T_ACCOUNT
WHERE A_ACCOUNT = P_ACCOUNT_OUT;
IF (V_ACCOUNTCOUNT = 0) THEN
RAISE_APPLICATION_ERROR(-20001, '转出账户不存在!');
END IF;
SELECT COUNT(A_ACCOUNT)
INTO V_ACCOUNTCOUNT
FROM T_ACCOUNT
WHERE A_ACCOUNT = P_ACCOUNT_IN;
IF (V_ACCOUNTCOUNT = 0) THEN
RAISE_APPLICATION_ERROR(-20002, '转入账户不存在!');
END IF;
SP_ADD_OPERATION(3, P_ACCOUNT_OUT);
SELECT A_BALANCE
INTO V_BALANCE
FROM T_ACCOUNT
WHERE A_ACCOUNT = P_ACCOUNT_OUT;
SP_ADD_OPERATION_DETAIL(V_BALANCE,
'账户:' || P_ACCOUNT_OUT || ',查询余额');
IF (P_MONEY > V_BALANCE) THEN
SP_ADD_OPERATION_DETAIL(V_BALANCE,
'账户:' || P_ACCOUNT_OUT || ' ,余额不足'||P_MONEY||'元,转账失败');
SP_OPERATION_SUCCESS_OR_FAILED(0);
RAISE_APPLICATION_ERROR(-20003, '余额不足' || P_MONEY || '元!');
ELSE
UPDATE T_ACCOUNT
SET A_BALANCE = A_BALANCE - P_MONEY
WHERE A_ACCOUNT = P_ACCOUNT_OUT;
SP_ADD_OPERATION_DETAIL(-P_MONEY,
'账户:' || P_ACCOUNT_OUT || ',转出金额');
UPDATE T_ACCOUNT
SET A_BALANCE = A_BALANCE + P_MONEY
WHERE A_ACCOUNT = P_ACCOUNT_IN;
SP_ADD_OPERATION_DETAIL(P_MONEY,
'账户:' || P_ACCOUNT_IN || ',转入金额');
SP_OPERATION_SUCCESS_OR_FAILED(1);
COMMIT;
END IF;
END;
分享到:
相关推荐
这两种技术标准在实现BC方面具有显著的优势: - **Web服务**:Web服务提供了一种标准的方式来定义和实现服务接口,支持多种传输协议(如HTTP、SOAP等),易于与其他系统集成。 - **OSGi**:OSGi(Open Service ...
调拨方式有两种基本模式:人工调拨和系统自动调拨。对于调拨频率较低、账户数量较少的情况,人工操作可能是合适的。然而,对于大规模、高频的资金调拨,系统自动调拨成为主流,它能够实时响应业务需求,自动发起调拨...
远程协助包括两种主要形式:一种是通过远程终端进行语言交流,同步提供客户交易信息,相当于低柜柜员的工作;另一种是远程协助进行交易核验,甚至小额无纸化电子转账和现金支付联动,类似于高柜柜员的角色。技术方面...
这个项目主要使用了.NET框架和ASP.NET技术,这两种技术在Web应用程序开发中具有广泛应用。下面将详细阐述该项目涉及的知识点。 1. **.NET框架**:.NET框架是微软公司推出的一种全面的开发平台,它提供了运行时环境...
首先,从编程语言的角度来看,Java是一种跨平台的、面向对象的编程语言,其特性包括垃圾回收、自动内存管理、丰富的类库和强大的异常处理机制。在这个项目中,Java的这些特性使得开发者能够专注于业务逻辑,而不需要...
该系统采用了Java(XFire框架)和C#两种语言,实现在异构数据库环境下的集成操作。 - **3.1 系统架构设计** - **服务端模块**:实现账户管理、转账处理等功能。 - **客户端模块**:提供用户界面,允许用户进行...
供应链的分类可以从不同的角度出发,常见的分类方法有两种:一种是按功能划分,分为有效性供应链和反应性供应链;另一种是按范围划分,分为企业内部供应链、产业供应链和全球网络供应链。有效性供应链主要关注物流的...
这个系统通常由前端用户界面和后端数据库两大部分组成,通过网络通信实现数据交换。下面将详细探讨Java在银行账目管理系统中的应用及关键知识点。 1. **Java编程语言基础**:Java是跨平台的面向对象编程语言,其...
ATM自动取款机系统是金融领域中常见的一种信息技术应用,它主要负责处理用户的存取款、转账等操作。这个项目包含的是一整套用Java编程语言开发的ATM系统,以及相关的毕业论文,提供了从理论到实践的全面理解。 首先...
基于需求分析结果,本系统被设计为管理员和用户两种角色。管理员角色负责管理整个系统,包括用户管理、银行账户管理、存款信息管理、取款信息管理、转账信息管理、挂失信息管理等。用户角色负责个人中心、用户管理、...
5.3 交易管理:实现转账、存款、取款等操作,记录详细的交易信息。 5.4 查询统计:提供交易历史查询、账户余额统计等报表功能。 5.5 安全机制:密码加密、异常登录检测、操作日志记录等,保障系统安全。 6 系统测试...
这个系统通常由前端用户界面和后端数据库两大部分组成,涉及到的核心技术包括Java编程语言、Swing或JavaFX图形用户界面(GUI)框架、SQL数据库操作以及面向对象的设计原则。 1. **Java编程语言**:Java是一种广泛...
《Java银行账户管理系统》是一个基于Java技术的毕业设计项目,主要涵盖了软件工程的各个阶段,包括需求分析、系统设计、编码实现、测试与维护。这个系统不仅提供了完整的源代码,还附带了相关的论文,为学习者提供了...
1.B/S结构是当前主流的软件架构之一,它将系统分为浏览器端和服务器端两部分,浏览器端负责用户界面和交互,服务器端负责业务逻辑和数据存储。 2.JSP(Java Server Pages)是一种服务器端脚本语言,用于生成动态Web...
互联网金融是在互联网技术迅猛发展的背景下,结合传统金融业务与现代信息技术,通过网络平台进行资金融通的一种新型金融模式。它以网络为载体,通过大数据、云计算、移动支付等现代信息科技手段,实现支付、融资、...
5. **MVC(模型-视图-控制器)模式**:这是一种常见的软件设计模式,用于分离业务逻辑、用户界面和数据管理。在银行系统中,模型负责处理数据,视图展示信息,控制器处理用户输入。 6. **异常处理**:在处理银行...
通过上述知识点的详细解读,我们可以看到分布式事务不仅涉及事务的基本属性,还包含了多种管理和实现方式,以及对一致性的不同理解和追求。这些内容对于深入理解分布式系统的事务管理具有重要的指导意义。
家庭理财信息管理系统是一种典型的信息管理系统(MIS),其核心目标在于帮助家庭或个人有效地管理财务信息,实现收入、支出、转账等财务活动的可视化与自动化。系统开发涉及后台数据库建设和前端应用开发两大部分,...