Spring、Hibernate、MySQL-事务如何工作-结论/问题**

Spring、Hibernate、MySQL-事务如何工作-结论/问题**,mysql,hibernate,spring,transactions,Mysql,Hibernate,Spring,Transactions,我使用SpringFramework 3.0.5、Hibernate3.6和MySQL服务器5.1。我有一些关于交易管理的问题。我个人使用spring的声明性事务管理。如果你能用是/否(或正确/不正确)回答我的问题,并在必要时给出简短的解释,那就太好了。如果有不同的意见,有几个人来回答就好了。谢谢:-) 1)您认为这句话是正确的吗:DBMS负责事务及其行为的总体实现 1)B)也许最好这样说:DBMS负责事务的一般实现和数据库的行为(例如,当事务回滚时) 2)Hibernate只使用数据库连接。它

我使用SpringFramework 3.0.5、Hibernate3.6和MySQL服务器5.1。我有一些关于交易管理的问题。我个人使用spring的声明性事务管理。如果你能用是/否(或正确/不正确)回答我的问题,并在必要时给出简短的解释,那就太好了。如果有不同的意见,有几个人来回答就好了。谢谢:-)

1)您认为这句话是正确的吗:DBMS负责事务及其行为的总体实现

1)B)也许最好这样说:DBMS负责事务的一般实现和数据库的行为(例如,当事务回滚时)

2)Hibernate只使用数据库连接。它需要事务,但不配置任何有关事务及其行为的(!)设置

3)但是:要处理事务,Hibernate需要知道事务从何处开始、提交到何处以及需要回滚

4)Hibernate是否还需要知道发生回滚时的情况?我认为没有,因为这应该在DBMS中定义。(这意味着:哪些表应该被锁定,哪些数据库操作应该被撤消,等等,对吗?)

5)对于3),可以使用编程或声明式事务管理

6)使用programmativ事务管理时,Hibernate需要知道的一切(3)都可以由开发人员手动写入源代码中

7)对于声明性事务管理,需要一个附加的hibernate框架,例如Spring

8)Spring管理事务。这就像是他们的一个框架。它触发操作,如启动和回滚事务

9)Spring还可以定义哪些异常必须回滚,哪些异常不能回滚

10)发生回滚时,Spring是否还有其他功能?我认为数据库负责回滚,spring只是触发它,对吗?这只是为了确保

谢谢:-)


[编辑] 这是对达菲莫的回答,太长了,我不能在8小时内回答我自己的问题,这就是为什么现在我必须把它放在这里。对不起

@达菲莫

有趣的答案,以下是我的想法:

  • 所以我们同意,当事务回滚或提交时,数据库的行为(当然!)是由DBMS直接实现或定义的,对吗? 我知道事务管理器(PlatformTransactionManager),但我真的认为它只是启动事务、回滚和提交。这意味着,它与数据库处理事务的方式无关,对吗? 我猜我的口头表达是错误的,我更新了它(1B)

  • 这对我来说有点抽象。这是不是意味着我的句子是正确的

  • 它怎么能自己标记呢?我认为这必须由开发商来完成?我想到“开始发送,提交…”这可以由开发人员在源代码中完成

  • 我同意。这是我发现在所有这些文档中有点难以理解的一件事。它们告诉你哪些交易被捕获,哪些交易没有被捕获,但如果你想知道如何处理它们,你必须自己去发现。一开始我很困惑,因为我不确定是否可以用try/catch块来包围事务注释方法的调用,以便捕获异常并通知用户。仅仅回滚事务是不够的,我需要通知用户。这就是为什么我几乎在任何地方都使用try/catch-您如何处理这个问题

  • 这是我不明白的一点。Spring提供了编程和声明式事务管理。如果Spring自己管理事务,那么当然会使用声明性transman。这是。。。在我眼里。。简单的编程。我不确定您是否可以说“Hibernate==programmatical”,因为您可以将Hibernate同时用于编程和声明性事务管理。也许可以说hibernate不提供声明性事务管理

  • 我甚至不知道“在JDBC中”这样做是可能的——我必须承认,我当时不知道这是如何详细工作的。有趣的是,当你读到你认为我反对使用声明性事务时(如果我没有误解你的话),我真的很欣赏声明性事务管理。:-)我认为它非常容易使用,当阅读代码时,它是非常容易理解的

  • 如果我想将Hibernate与声明性事务管理结合使用,我需要一个类似Spring的附加框架。因为声明性意味着,一个额外的框架“完成了您必须以编程方式完成的所有工作”。(如启动发送、提交、回滚)。我还猜想Spring可能不是为hibernate提供声明性事务管理的唯一框架。但我问题的要点是,如果不使用额外的框架,就不可能对hibernate使用声明性事务管理。我希望我现在能正确地表达它:-)

  • 好,对。因此事务管理器触发回滚、启动tx等等

  • 好的

  • 对不起:-)
  • 我只是想了解事情是如何运作的。我一次又一次地阅读文档,但是如果你是自学成才的话,了解基本事实是很重要的。这就是为什么我要问:-)谢谢你的帮助

    以下是我的看法:
    // prototypical write operation
    public void update(Connection connection) throws SQLException
    {
        connection.setAutoCommit(false);
        try
        {
            // SQL logic here
            connection.commit();  // if you get here, success
        } 
        catch (SQLException e)
        {
            try { if (connection != null) connection.rollback(); } catch (SQLException e) {}
            // might do some other things here (logging, etc.)
            // sql error codes will tell you why; spring translates these for you.
        }
        finally
        {
            // close statements here in individual try/catch blocks.
        }
    }