Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javaservlet:执行多个插入和锁定表的更好方法?_Java_Tsql_Servlets_Transactions - Fatal编程技术网

Javaservlet:执行多个插入和锁定表的更好方法?

Javaservlet:执行多个插入和锁定表的更好方法?,java,tsql,servlets,transactions,Java,Tsql,Servlets,Transactions,我目前正在使用建议的ParedStatement类在java servlet中运行以下代码段。它目前正在将库存数据插入会计系统的SQL Server数据库。我有两个问题 因为insert语句将数据插入3个不同的表中,所以我是否应该将这些sql语句移动到数据库上的tsql过程调用中,并使用事务锁定表 每当用户打开会计软件库存屏幕时,最后两条插入语句都会失败。我猜当用户打开屏幕时,软件客户端会锁定表 代码如下: try { con = java.sql.DriverManag

我目前正在使用建议的ParedStatement类在java servlet中运行以下代码段。它目前正在将库存数据插入会计系统的SQL Server数据库。我有两个问题

  • 因为insert语句将数据插入3个不同的表中,所以我是否应该将这些sql语句移动到数据库上的tsql过程调用中,并使用事务锁定表
  • 每当用户打开会计软件库存屏幕时,最后两条插入语句都会失败。我猜当用户打开屏幕时,软件客户端会锁定表 代码如下:

    try {   
    
            con = java.sql.DriverManager.getConnection(getConnectionUrl()); 
            //get next itemkey 
            CallableStatement cstmt = con.prepareCall("{call spGetNextSurrogateKey (?,?)}");
            cstmt.setString("iTableName","timitem");
            cstmt.registerOutParameter("oNewKey", java.sql.Types.INTEGER);
            cstmt.execute(); 
            int rs4 = cstmt.getInt(2);
            cstmt.close();
    
            String query = "insert into timitem (itemkey, AllowCostOvrd,AllowDecimalQty,AllowDropShip,AllowPriceOvrd,AllowRtrns,AvailForSale,CompanyID,CreateDate,CreateUserID,CreateType,DateEstab,DfltSaleQty,HazMat,InclOnPackList,InternalLongDesc,IntrnlDeliveryReq,ItemClassKey,ItemID,ItemSubType,ItemType,MinGrossProfitPct,MinSaleQty,PerUsageOrdLimit,PriceSeq,PriceUnitMeaskey,PurchProdLineKey,PurchUnitMeasKey,RcptReq,RestockRate,SaleMultiple,SalesUnitMeasKey,Seasonal,ShelfLife,Status,STaxClasskey,StdPrice,StdUnitCost,StockUnitMeasKey,SubjToTradeDisc,TargetMargin,TrackMeth,UpdateCounter,ValuationMeth,WarrantyDays,WarrantyProvider) values ( '" +rs4 + "', 0,0,1,1,1,1,'ens','" + DateFormat.format(Date) + "','admin',1,'" + DateFormat.format(Date) + "',1,0,1,0,0,"+itemclasskey+",'" + partnumber + "',1,5,0,1,0,0,112,"+PurchProdLineKey+","+UnitMeasKey+",1,0,0,112,0,0,1,12,"+ itemlistprice + ","+itemcost + ",112,0,0,2,0,5,0,0)";
            PreparedStatement pstmt = con.prepareStatement(query); 
            pstmt.executeUpdate(); 
            pstmt.close();            
    
                    String query_descrip = "insert into timitemdescription (itemkey, languageid, longdesc, shortdesc) values ('" + rs4 + "', 1033, '" + itemdescription + "','"+ "_" + "')";
    
                    PreparedStatement pstmt2 = con.prepareStatement(query_descrip); 
            pstmt2.executeUpdate();                         
                    pstmt2.close();
    
                    String query_UOM = "insert into timItemUnitOfMeas (itemkey, TargetUnitMeasKey, conversionfactor, unitvolume, unitweight,upc,useforpurchases,useforsales,usestdconv) values ('" + rs4 + "', "+UnitMeasKey+", '1',0,0,NULL,0,0,0)";
    
                    PreparedStatement pstmt3 = con.prepareStatement(query_UOM); 
            pstmt3.executeUpdate();                         
                    pstmt3.close();
    
    
    }catch(java.sql.SQLException e){ e.printStackTrace(); }     //end try 
    

    有什么建议吗?提前感谢。

    在较低级别使用JDBC时,每个语句在执行时都会自动提交。要在一个事务中执行多个语句,请在
    连接上调用
    setAutoCommit(false)
    ,并通过调用连接上的
    commit()
    完成工作单元。如果出现故障,请调用
    rollback()


    现在,更常见的是使用JPA这样的持久性机制来管理事务,使用框架或容器。此基础结构可以很好地处理常见的事务场景。

    在较低级别上使用JDBC,每个语句在执行时都会自动提交。要在一个事务中执行多个语句,请在
    连接上调用
    setAutoCommit(false)
    ,并通过调用连接上的
    commit()
    完成工作单元。如果出现故障,请调用
    rollback()


    现在,更常见的是使用JPA这样的持久性机制来管理事务,使用框架或容器。这个基础架构可以很好地处理常见的事务场景。

    我建议您不要在servlet中这样做。将代码移动到一个持久层中,您可以在不使用servlet容器的情况下对其进行离线测试

    我也推荐。将应用分层,使web和持久性层不再是一个好主意


    我建议您不要在servlet中执行此操作。将代码移动到一个持久层中,您可以在不使用servlet容器的情况下对其进行离线测试

    我也推荐。将应用分层,使web和持久性层不再是一个好主意