假设我有一个包含有效数据的表。我想以某种方式修改这些数据,但我想确保如果修改中出现任何错误,表格不会更改,并且该方法会返回相应的内容。
例如,(这是一个愚蠢的例子,但它说明了与我相关的观点)假设我想编辑“名称”列中的所有条目,以便它们被正确地大写。出于某种原因,我希望所有的名称都具有适当的大小写,或者它们中没有一个具有适当的大写(并且表的起始状态是它们中的NONE)。
是否已经实现了在表上运行批量更新的方法,并确保如果其中任何一个更新失败,所有更改都将回滚并且表保持不变?
我可以想出几种方法来手动执行此操作(虽然欢迎提出建议),但如果有一些我可以使用的方法会以这种方式运行,那就太好了。我查看了java.sql.statement.executeBatch()
命令,但我不相信文档说如果以某种方式失败我的表就不会被更改。
答案 0 :(得分:8)
我在使用JDBC时也遇到了这个问题 - 它似乎面对我对数据库和ACID保证的理解。
在开始之前,请确保您的MySQL storage engine支持交易。 MyISAM不支持事务,但InnoDB支持事务。
然后一定要禁用JDBC autoCommit - Connection.setAutoCommit(false)
,否则JDBC会将每个语句作为单独的trasaction运行。提交将是一个全有或全无的事情 - 不会有部分变化。
然后运行各种更新语句,最后调用Connection.commit()
来提交事务。
有关JDBC事务的更多详细信息,请参阅Sun Tutorial。
使用批处理不会改变ACID保证 - 您要么已成交,要么未成功! - 批处理更多的是一起收集多个语句以提高性能。