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
有趣的答案,这是我对它的看法:
所以我们同意,当事务被回滚或提交时,数据库的行为(当然!)是由DBMS直接实现或定义的,对吗?我知道事务管理器(PlatformTransactionManager),但我真的认为它只是启动事务,回滚和提交.这意味着,数据库处理HOW事务是不可靠的,对吗?我猜我的言语是错误的,我更新了(1B)
这对我来说有点抽象.这是否意味着我的句子是正确的或不是它:-)
它如何单独标记?我认为这必须由开发人员完成?我想到了"start tx,commit ...",这可以由开发人员在源代码中完成
我同意.这有一件事我觉得在所有这些文件中都有点难以理解.它们告诉我们哪些交易被捕获,哪些交易不存在,但是为了找到如何处理它们,你必须自己找出来.我在开始时感到困惑,因为我不确定是否可以用try/catch-block包围事务注释方法的调用以捕获异常并通知用户.它根本不足以让事务回滚,我需要通知用户.这就是为什么我几乎无处不在使用try/catch - 你如何处理这个?
这是我不明白的一点.Spring提供程序化和声明式事务管理.如果Spring本身管理事务,当然使用声明性transman.程序化......在我眼里......简单的程序化.我不确定你是否可以说"Hibernate == programmatic",因为你可以使用Hibernate进行编程和声明式事务管理.也许可以说hibernate不提供ITSELF声明式事务管理.
我甚至不知道有可能"在JDBC中"这样做 - 我必须承认我不知道这是如何工作的.不知何故,有趣的是,虽然读到你认为我反对使用声明性交易(如果我没有误解你),我真的很感激声明式交易管理.:-)我认为它非常容易使用,在阅读代码时它是非常容易理解的.
如果我想将Hibernate与声明式事务管理一起使用,我需要一个像Spring这样的额外框架.因为声明性的意思是,一个额外的框架"完成了你必须以编程方式完成的所有工作".(比如开始tx,提交,回滚).我也猜测Spring可能不是唯一为hibernate提供声明式事务管理的框架.但我的问题的主要观点是,如果不使用额外的框架,就不可能对hibernate使用声明式事务管理.我希望我现在正确地说它:-)
好的,正确的.所以事务管理器触发回滚,启动tx,依此类推
好..
我只想了解事情是如何运作的.我一遍又一遍地阅读文件,但如果你自己学习一切,理解基本事实就很重要.这就是为什么我问:-)谢谢你的帮助!:-)
这是我的看法:
你真正的意思是什么?我很想知道.
您始终可以在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)
| 归档时间: |
|
| 查看次数: |
1369 次 |
| 最近记录: |