Spring,Hibernate,MySQL - 交易如何运作 - 结论/问题**

nan*_*no7 5 mysql spring hibernate transactions

我使用Spring Framework 3.0.5,Hibernate 3.6和MySQL Server 5.1.我总体上对交易管理有一些疑问.我个人使用spring的声明式事务管理.如果你能用是/否(或正确/不正确)回答我的问题,那将是很好的,如果有必要,可以给出简短的解释.如果有不同的意见,有几个人会回答,这将是很好的.谢谢 :-)

1)你会说这句话是正确的:DBMS负责交易及其行为的普遍实施.

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

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

3)但是:为了处理事务,Hibernate需要知道,事务开始的地方,提交并需要回滚.

4) Hibernate是否还需要知道回滚的情况?我认为不,因为这应该在DBMS中定义.(这意味着:哪些表应被锁定,哪些数据库操作应该撤消,等等,是否正确?)

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

6)当使用programmativ事务管理时,Hibernate需要知道的所有内容(3))可以由开发人员手动编写在源代码中.

7)对于声明式事务管理,需要一个额外的休眠框架,例如Spring.

8) Spring管理事务.它就像是他们的框架.它会触发操作,例如启动和回滚事务.

9) Spring还可以定义回滚必须或不必发生的异常

10)当回滚发生时,Spring是否还有其他东西?我认为数据库负责回滚,spring只是触发它,对吧?它只是为了确保....

谢谢 :-)


[编辑]这是duffymo的答案,评论太长了,我不能在8小时内回答我自己的问题,这就是为什么现在我必须把它放在这里.抱歉.

@duffymo

有趣的答案,这是我对它的看法:

  1. 所以我们同意,当事务被回滚或提交时,数据库的行为(当然!)是由DBMS直接实现或定义的,对吗?我知道事务管理器(PlatformTransactionManager),但我真的认为它只是启动事务,回滚和提交.这意味着,数据库处理HOW事务是不可靠的,对吗?我猜我的言语是错误的,我更新了(1B)

  2. 这对我来说有点抽象.这是否意味着我的句子是正确的或不是它:-)

  3. 它如何单独标记?我认为这必须由开发人员完成?我想到了"start tx,commit ...",这可以由开发人员在源代码中完成

  4. 我同意.这有一件事我觉得在所有这些文件中都有点难以理解.它们告诉我们哪些交易被捕获,哪些交易不存在,但是为了找到如何处理它们,你必须自己找出来.我在开始时感到困惑,因为我不确定是否可以用try/catch-block包围事务注释方法的调用以捕获异常并通知用户.它根本不足以让事务回滚,我需要通知用户.这就是为什么我几乎无处不在使用try/catch - 你如何处理这个?

  5. 这是我不明白的一点.Spring提供程序化和声明式事务管理.如果Spring本身管理事务,当然使用声明性transman.程序化......在我眼里......简单的程序化.我不确定你是否可以说"Hibernate == programmatic",因为你可以使用Hibernate进行编程和声明式事务管理.也许可以说hibernate不提供ITSELF声明式事务管理.

  6. 我甚至不知道有可能"在JDBC中"这样做 - 我必须承认我不知道这是如何工作的.不知何故,有趣的是,虽然读到你认为我反对使用声明性交易(如果我没有误解你),我真的很感激声明式交易管理.:-)我认为它非常容易使用,在阅读代码时它是非常容易理解的.

  7. 如果我想将Hibernate与声明式事务管理一起使用,我需要一个像Spring这样的额外框架.因为声明性的意思是,一个额外的框架"完成了你必须以编程方式完成的所有工作".(比如开始tx,提交,回滚).我也猜测Spring可能不是唯一为hibernate提供声明式事务管理的框架.但我的问题的主要观点是,如果不使用额外的框架,就不可能对hibernate使用声明式事务管理.我希望我现在正确地说它:-)

  8. 好的,正确的.所以事务管理器触发回滚,启动tx,依此类推

  9. 好..

  10. 抱歉:-)

我只想了解事情是如何运作的.我一遍又一遍地阅读文件,但如果你自己学习一切,理解基本事实就很重要.这就是为什么我问:-)谢谢你的帮助!:-)

duf*_*ymo 5

这是我的看法:

  1. 最终,提交/回滚行为是在关系数据库中完成的,但是对数据库负全部责任并不完全准确.当您使用Spring,JDBC和关系数据库时,会涉及一个中间层,通常称为事务管理器.
  2. Hibernate以编程方式在对象中实现事务逻辑.
  3. Hibernate以编程方式标记事务的开始和结束.
  4. Hibernate可能想知道事务是否被回滚; 更重要的是,您的应用程序需要知道,以便它可以告诉用户.
  5. Hibernate == programmatic; Spring ==声明.
  6. 可以由开发人员编写.如果需要,您甚至可以在JDBC中执行所有操作.但是,声明性交易有很好的理由.(你听起来像是在试图证明不使用它们.我想知道为什么?)
  7. 不明白这一点 - 改写它.
  8. 交易经理负责交易.
  9. Spring会抛出相应的例外,是的.
  10. 你似乎一遍又一遍地重复同样的问题.

你真正的意思是什么?我很想知道.

您始终可以在JDBC中以编程方式执行此操作.最终,所有使用JDBC与关系数据库交互的Java解决方案都会使用,包括Hibernate和Spring.这是一个模板:

// 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.
    }
}
Run Code Online (Sandbox Code Playgroud)