Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package transactionwithlockex1.dao;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.util.List;
- import transactionwithlockex1.dto.SelectedItem;
- public class StockDAO {
- // 定数
- private static final String CONNECTION_STR = "jdbc:oracle:thin:@//172.16.4.6:1521/infopdb";
- private static final String DB_USERNAME = "demo2017";
- private static final String DB_PASSWORD = "demo2017";
- // 在庫数変更
- // 引数listの全商品の在庫数が変更できたら、コミット
- // もし1つでも在庫数が変更できない場合はロールバック
- public static boolean update(List<SelectedItem> list) throws SQLException
- {
- boolean result = true;
- try(
- Connection con = DriverManager.getConnection(CONNECTION_STR, DB_USERNAME, DB_PASSWORD);
- )
- {
- // 自動コミットオフ
- con.setAutoCommit(false);
- // preparedStatement用意
- PreparedStatement pstmt4Lock =
- con.prepareStatement("SELECT 在庫数 FROM 在庫管理_在庫データ WHERE 商品ID=? FOR UPDATE");
- PreparedStatement pstmt4Update =
- con.prepareStatement("UPDATE 在庫管理_在庫データ SET 在庫数=? WHERE 商品ID=?");
- try
- {
- for(SelectedItem item : list)
- {
- // ロック
- pstmt4Lock.setInt(1, item.getId());
- int currentStock = 0;
- try( ResultSet rs = pstmt4Lock.executeQuery() )
- {
- if(rs.next())
- {
- currentStock = rs.getInt("在庫数");
- }
- } // ここでResultSetは自動的にclose()される
- // 在庫数変更
- pstmt4Update.setInt(1,currentStock - item.getQuantity());
- pstmt4Update.setInt(2,item.getId());
- pstmt4Update.executeUpdate();
- }
- // ここまでこれたら全商品の在庫数変更成功
- con.commit();
- }
- catch(SQLException ex)
- {
- // DBアクセス時になんらかのエラー発生
- // まずはロールバック
- con.rollback();
- // エラー原因に応じて対応
- // 在庫数が足りない => チェック制約違反(エラーコード:2290)発生
- if(ex.getErrorCode() == 2290)
- {
- result = false;
- }
- else
- {
- throw ex;
- }
- }
- }
- return result;
- }
- }
Add Comment
Please, Sign In to add comment