事务是否适用于多个表中的语句?

时间:2013-02-16 16:19:16

标签: mysql jdbc

我在JDBC中使用JDBC。我有一个非常复杂的插入和更新系列,我在一次交易中做了。这似乎在很大程度上起作用,但是大约1%的时间我发现我的一个表中的数据处于不一致状态。

如果发生错误,我会回滚事务,但我不确定如何开始调试。我的设置通常如下:

try {
    conn.setAutoCommit(false);  

    PreparedStatement stmt1 = conn.prepareStatement("insert into table1");
    stmt1.executeUpdate();
    stmt1.close();

    PreparedStatement stmt2 = conn.prepareStatement("update table2");
    stmt2.executeUpdate();
    stmt2.close();

    ... more statements ...

    conn.commit();
} 
catch (Exception ex) {
    conn.rollback();
}

我正在使用2010版的mysql。我可能会尝试更新它,但我感觉我的应用程序代码中的更多内容会导致不一致。

我是否有任何调试工具可以帮助您在数据库级别提供帮助?还有其他指针吗?我使用JDBC和所有默认设置,我想知道在这种情况下我是否需要使用更严格的事务级别?

由于

-----注意----- 我所有的桌子都是InnoDb。

2 个答案:

答案 0 :(得分:0)

嗯..有趣。是的,它应该工作。我们多次使用多个表格中的大量交易,从未体验过奇怪的事情...... 你确定产生不一致的不是你(这里的意思是什么,你没有指明这个)?只需插入/更新错误的东西? :-)

只是一个想法 - 我们遇到了好几次。死锁解决。用于处理该数据库的DB服务器。如果您有多个并行线程并且事务块正在操作更多表,则发生死锁的可能性更高。在这种情况下,您的某些事务可能会被数据库服务器本身中止(并回滚)。这些交易将导致错误
您在上面编写的代码仅在异常情况下回滚(已中止的事务已经回滚,因此它不会做太多...),但您是否尝试打印/记录异常?如果不是,你应该
当然,交易是彼此分开运行的。但这可以解释为什么你只有1-2%的情况会遇到这种奇怪的行为......
你也应该检查你的mysql服务器的日志。服务器本身也可能因任何原因而失败。还有一个提示:您可以尝试运行“mysqltop”(或“mtop”,希望我能正确记住此工具的名称..)。这可以监视并显示数据库服务器内部发生的情况。然而,它主要用于跟踪我们的sqls的性能,这也显示失败。也许运行这个也可以帮助你...

答案 1 :(得分:0)

也许您在语句中使用DDL(创建表,alter table等)?

我不确定MySQL,但它可能无法回滚DDL语句。

例如:

  • PostgreSQL可以回滚DDL,
  • Oracle在执行DDL之前执行提交。

见这里:http://dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html