2011-11-23 26 views
6

我有两个使用preparedStatement的查询块。使用java处理Postgresql事务

这是第一:

String sql = "update cikan_malzeme set miktar = ? where proje_id = ? and malzeme_id = ?"; 
PreparedStatement prep = dbConnect.connection.prepareStatement(sql); 
prep.setFloat(1, toplam); 
prep.setInt(2, pid); 
prep.setInt(3, mid); 
prep.executeUpdate(); 

这是第二:

String sql2 = "update malzemeler set miktar = ? where malz_adi = ?"; 
PreparedStatement prep2 = dbConnect.connection.prepareStatement(sql2); 
prep2.setFloat(1, fark); 
prep2.setString(2, malzemeadi); 
prep2.executeUpdate(); 

现在我想用交易来执行它们BEGIN;和COMMIT; 我如何处理preparedStatement事务?

在此先感谢。

回答

8

将自动提交设置为false。

将您的PreparedStatements放入try块中。最后承诺;在catch块中回滚。

这就是通常在裸机JDBC中完成的过程。

http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

如果你使用EJB3或弹簧可以添加一个事务管理器和声明指定它们。这更加复杂和灵活。

+0

它需要在自动提交模式在创建会话或在hibernate文件中配置后,像setAutoCommit(true)那样的SELECT查询?我正在使用hibernate和postgresql – Satya

+0

如果你自己做一个SELECT,那么不需要事务逻辑,它用于写事务和管理回滚段 – duffymo

+0

仅用于需要非选择查询的方式,用于不需要查询的选择 – Satya

6

您应该使用Connection.setAutoCommit(false)来禁用自动提交,并且Connection.commit()Connection.rollback()

禁用自动提交时,首次执行需要事务的命令或查询时将自动启动事务。

你不应该使用在数据库特定事务控制命令(如司机将最有可能做对资源的额外清理在commit()或rollback()发出。

+0

在创建会话或在休眠文件中配置后,对于像setAutoCommit(true)这样的SELECT查询,在自动提交模式下是否需要它?我用postgresql使用hibernate。 – Satya

+0

@Satya请发表一个新的问题,评论不打算用于后续问题。 –

+0

当然。是否有任何重复存在,但没有找到任何东西,你可以请分享任何链接,你发现任何 – Satya