有没有一种通过JDBC原子执行MySQL语句的好方法?

jav*_*nix 2 java mysql atomic batch-file

假设我有一个包含有效数据的表.我想以某种方式修改这些数据,但我想确保如果修改中出现任何错误,表格不会更改,并且该方法会返回该效果.

例如,(这是一个愚蠢的例子,但它说明了与我相关的观点)假设我想编辑"名称"列中的所有条目,以便它们被正确地大写.出于某种原因,我希望所有的名称都具有适当的大小写,或者它们中没有一个具有适当的大小写(并且表的起始状态是它们中的NONE).

是否有已经实现的方法在表上运行批量更新,并确保如果任何一个更新失败,所有更改都将回滚并且表保持不变?

我可以想出几种方法来手工完成这个(尽管建议很受欢迎),但如果有一些我可以使用的方法会以这种方式运行,那就太好了.我查看了java.sql.statement.executeBatch()命令,但是我不相信文档说如果以某种方式失败我的表就不会被更改.

mdm*_*dma 8

当我从JDBC开始时,我也遇到了这个问题 - 它似乎面对我对数据库和ACID保证的理解.

在开始之前,请确保您的MySQL 存储引擎支持事务.MyISAM不支持事务,但InnoDB支持.

然后确保禁用JDBC autoCommit - Connection.setAutoCommit(false)或者JDBC将每个语句作为单独的trasaction运行.提交将是一个全有或全无的事情 - 不会有部分变化.然后运行各种更新语句,最后调用Connection.commit()提交事务.

有关JDBC事务的更多详细信息,请参见Sun Tutorial.

使用批处理不会改变ACID保证 - 您要么已成交,要么不成功! - 批处理更多的是一起收集多个语句以提高性能.