文档章节

数据库开发 - 事务单元作业

抢小孩糖吃
 抢小孩糖吃
发布于 2016/10/08 23:12
字数 646
阅读 27
收藏 0

#问题 1(100分)有一个在线交易电商平台,有两张表,分别是库存表和订单表,如下:

输入图片说明

现在买家XiaoMing在该平台购买bag一个,需要同时在库存表中对bag库存记录减一,同时在订单表中生成该订单的相关记录。 请编写Java程序,实现XiaoMing购买bag逻辑。订单表ID字段为自增字段,无需赋值。

#解答 ##购买事务逻辑 XiaoMing购买bag一个,首先检查是否还有剩余库存,如果有库存,则进行购买,如果没有库存,返回没有库存异常。当有库存时,对库存表中的记录减一,并生成订单记录。 ##事务与锁的分析 这里必须进行加锁,不然会发生各种问题,通过查阅相关资料,确定悲观锁,是相对稳健的形式。 ##初始化数据库 homework.sql

CREATE TABLE `inventory` (
`ID`  int NOT NULL AUTO_INCREMENT ,
`ProductName`  varchar(100) NULL ,
`Inventory`  int NULL ,
PRIMARY KEY (`Id`)
);

INSERT INTO `inventory` (`ID`, `ProductName`, `Inventory`) VALUES ('1', 'watch', '25');
INSERT INTO `inventory` (`ID`, `ProductName`, `Inventory`) VALUES ('2', 'bag', '20');

CREATE TABLE `order` (
`ID`  int NOT NULL AUTO_INCREMENT ,
`buyer`  varchar(100) NULL ,
`ProductName` varchar(100) NULL ,
PRIMARY KEY (`Id`)
);

##执行测试类

package com.hava.transition;

import junit.framework.TestCase;

/**
 * Created by zhanpeng on 2016/10/8.
 */
public class OrderDAOTest extends TestCase {
    public void testTransferAccount() throws Exception {
        OrderDAO orderDAO = new OrderDAO();
        orderDAO.init();
        orderDAO.buyOne("XiaoMing","bag");
    }
}

##数据库访问类

package com.hava.transition;

import org.apache.commons.dbcp2.BasicDataSource;

import java.sql.*;

/**
 * Created by zhanpeng on 2016/10/8.
 */
public class OrderDAO {

    public static BasicDataSource basicDataSource = null;

    public final static String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    public final static String DB_URL = "jdbc:mysql://192.168.1.200/test";
    public final static String USER = "root";
    public final static String PASSWORD = "dVHJtG0T:pf*";

    public void init()
    {
        basicDataSource = new BasicDataSource();
        basicDataSource.setUrl(DB_URL);
        basicDataSource.setDriverClassName(JDBC_DRIVER);
        basicDataSource.setUsername(USER);
        basicDataSource.setPassword(PASSWORD);
    }

    public void buyOne(String buyer,String productName) throws ClassNotFoundException {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            connection = basicDataSource.getConnection();
            //开启事务
            connection.setAutoCommit(false);
            //使用悲观锁
            String getproduct_sql = "SELECT Inventory FROM inventory WHERE(ProductName = ?) FOR UPDATE";
            preparedStatement = connection.prepareStatement(getproduct_sql);
            preparedStatement.setString(1,productName);
            resultSet = preparedStatement.executeQuery();
            int inventory = -1;
            while(resultSet.next())
                inventory = resultSet.getInt("Inventory");

            System.out.println("[inventory]:" + inventory);

            if(inventory <= 0)
            {
                System.out.println("没有库存");
                throw new SQLException();
            }
            else
            {
                //减少库存
                String subproduct_sql = "UPDATE inventory SET Inventory=? WHERE (ProductName = ?)";
                preparedStatement = connection.prepareStatement(subproduct_sql);
                preparedStatement.setInt(1,inventory - 1);
                preparedStatement.setString(2,productName);
                preparedStatement.execute();

                //新增订单
                String addorder_sql = "INSERT INTO `order` (`buyer`, `ProductName`) VALUES (?, ?)";
                preparedStatement = connection.prepareStatement(addorder_sql);
                preparedStatement.setString(1,buyer);
                preparedStatement.setString(2,productName);
                preparedStatement.execute();

                //提交事务
                connection.commit();
            }




        } catch (SQLException e) {
            // ignore
            System.out.println("[SQLException]:" + e.toString());
            //如果发生异常则回滚事务
            if(connection != null)
                try {
                    //发生异常回滚
                    connection.rollback();

                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
        } finally {
            if (preparedStatement != null)
            {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

#参考文献 mysql处理高并发,防止库存超卖
电商 对于特定数量的商品 如何在高并发下进行库存锁定呢?
订单系统中并发问题和锁机制的探讨
企业应用架构模式

© 著作权归作者所有

共有 人打赏支持
抢小孩糖吃

抢小孩糖吃

粉丝 68
博文 236
码字总数 229004
作品 0
东城
程序员
数据库中间件 Sharding-JDBC 源码分析 —— 事务(一)之BED

摘要: 原创出处 www.iocoder.cn/Sharding-JD… 「芋道源码」欢迎转载,保留摘要,谢谢! 本文主要基于 Sharding-JDBC 1.5.0 正式版 1. 概述 2. 最大努力送达型 3. 柔性事务管理器 3.1 概念 ...

芋道源码掘金Java群217878901
2017/11/05
0
0
大数据批处理框架 Spring Batch全面解析

如今微服务架构讨论的如火如荼。但在企业架构里除了大量的OLTP交易外,还存在海量的批处理交易。在诸如银行的金融机构中,每天有3-4万笔的批处理作业需要处理。针对OLTP,业界有大量的开源框...

huojiao2006
2017/01/09
0
0
民生银行核心分布式改造实践分享

摘要:在没有分布式技术之前,国内银行的核心系统面临着很多挑战。以民生银行为例,2013年的时候每天交易量约1800万笔,整个项目的硬件和运维投入达到1.1亿多,成本非常高昂。中国民生银行总...

黄小凡
06/25
0
0
数据库中间件 Sharding-JDBC 源码分析 —— 分布式事务(一)之最大努力型

摘要: 原创出处 http://www.iocoder.cn/Sharding-JDBC/transaction-bed/ 「芋道源码」欢迎转载,保留摘要,谢谢! 本文主要基于 Sharding-JDBC 1.5.0 正式版 1. 概述 2. 最大努力送达型 3. 柔...

芋道源码
2017/11/05
0
1
J2EE快速应用开发平台 工作流平台 数据交换 和 规则引擎 代码生成

GAP全称是UFIDA Software Engineering Global Application Platform,是用友工程软件(现瑞友科技)集多年开发实施经验所提炼的J2EE快速应用构件化开发平台。它不仅是一套快速开发应用软件的...

孙义山
2012/01/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

awk命令用法介绍

10月18日任务 9.6/9.7 awk 1.awk(上)(下) 1.awk 分段操作功能 指定分隔符,并把第一段打印出来,不会改动文件内容 将所有内容打印出来 awk 没有指定分隔符号,则会默认用空格或者空白字符...

hhpuppy
30分钟前
0
0
Spring Cloud Eureka Server高可用之:在线扩容

本文共 1591字,阅读大约需要 6分钟 ! 概述 业务微服务化以后,我们要求服务高可用,于是我们可以部署多个相同的服务实例,并引入负载均衡机制。而微服务注册中心作为微服务化系统的重要单元...

CodeSheep
42分钟前
1
0
内网esxi主机上安装CoreOS虚拟机

CoreOS是一个为专门运行容器而设计的轻量级linux发行版,旨在通过轻量的系统架构和灵活的应用程序部署能力简化数据中心的维护成本和复杂度。它没有包管理工具,运行容器化应用以提供服务;默...

hiwill
今天
1
0
20181018 上课截图

![](https://oscimg.oschina.net/oscnet/49f66c08ab8c59a21a3b98889d961672f30.jpg) ![](https://oscimg.oschina.net/oscnet/a61bc2d618b403650dbd4bf68a671fabecb.jpg)......

小丑鱼00
今天
3
0
WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部