我使用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,依此类推
好..
我只想了解事情是如何运作的.我一遍又一遍地阅读文件,但如果你自己学习一切,理解基本事实就很重要.这就是为什么我问:-)谢谢你的帮助!:-)
我使用Spring 3和Hibernate 3.6开发Web应用程序 - 我是新的,我想知道我是否真的理解会话是如何工作的.
是否正确,由会话ID标识的服务器和客户端之间的会话与休眠会话不同?
服务器和客户端之间的会话始终是HttpSession.(?)什么时候创建?当用户登录时,或者当匿名用户请求页面(不受保护)时?
httpsession和hibernate-sessions之间有什么联系吗?是否由sessionfactory创建的Hibernate会话与httpsession没有连接?我不确定hibernate使用这样的命令引用哪个会话:
this.sessionFactory.getCurrentSession().save(object);
Run Code Online (Sandbox Code Playgroud)
这个getCurrentSession():这个休眠会话活动了多长时间?用户登录的整个时间?或仅用于一个事务(可以包括多个数据操作?)
我很抱歉这个问题可能很容易回答,但是大多数文件都是英文的,如果不是,那么母语理解有时很难(主要是因为经常使用"会话"这个词)
谢谢你帮我理解这个话题!:-)
我是grails的新手(1.3.7)所以请耐心等待:-)
我有一个gsp,我有各种复选框.用户可以单击它们,然后将其答案发送给控制器.控制器正在接收此请求.
我的问题是,为了处理用户选择的内容,我必须检查每个参数 - 看看是否真的选中了这个复选框.这真的很麻烦,并且不能很好地工作,因为显示复选框的页面是动态的 - 所以可以点击的复选框也是动态的.在我的控制器中,我不知道我必须检查哪些参数.
是否有可能在我的控制器中收到所有复选框(或更好:所有选中的复选框)的列表?我研究过但没有找到答案!
谢谢回答!:-)
[编辑]
谢谢,
params.name.each{i->
System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)
是非常简单和工作:-)它只是给回检查的
我正在使用Spring Framework 3和Hibernate 3.6进行Web应用程序,并尝试了解事务管理的工作原理.我将mySQL Server 5.1与InnoDB表一起使用.我基于简单的Hibernate 3 API编写了我的DAO.
1)是否正确,mySQL Server本身指定了如何处理事务?这意味着它决定何时需要锁定记录?
2)当我在spring中声明一个方法为@transactional(readOnly = true)或@transactional(readOnly = false)时,这会影响在事务期间是否锁定了数据线?这意味着,当readOnly = true时,没有锁定datarecord,当readOnly = false时,所有使用过的数据线都被锁定了吗?
3)当readOnly = true并且我读取各种数据记录时会发生什么.让我们假设在读取过程中它们被另一个事务更改,因此我得到一些旧记录和一些新记录.那可能吗?
4)何时发生提交?成功交易或会话结束后?
5)什么时候开始hibernate会话?每个会话(服务器和客户端之间)或每个事务?
6)到底谁负责交易管理?spring或mysql还是两者兼而有之?
谢谢回答!:-)
我正致力于使用MySQL Server 5.1,Spring 3.0.5和Hibernate 3.6开发Web应用程序.我使用Springs Transaction Management.我是新手,所以如果我问一个容易回答的问题,请耐心等待.:-)
1)我读到了有关全局(xa)和本地事务的信息.是否正确,全局事务是指在不同资源(如不同数据库)上执行数据操作的事务.并且本地事务仅在一个资源(数据库)上执行数据操作.
2)是否可以与Hibernate进行全局事务?在Spring Reference Documentation中,我读到:"您也可以轻松使用Hibernate本地事务,如以下示例所示.在这种情况下,您需要定义一个Hibernate LocalSessionFactoryBean,您的应用程序代码将使用它来获取Hibernate Session实例. " 这就是为什么我认为Hibernate事务可能总是本地的,我没有找到任何关于它的东西.
3)为什么可以将MyISAM表与Hibernate一起使用?他们不支持交易,我认为Hibernate需要交易?我真的不明白这一点.起初我认为这是不可能的 - 但为什么可以用Hibernate创建MyISAM表并使用MyISAM方言呢?这是如何运作的???Hibernate是否需要交易或不需要交易?我想使用Hibernate你需要使用InnoDB.
谢谢回答!:-)
再一次关于ArrayList和同步的问题.
我只想知道这个片段到底做了什么:
ArrayList<ObjectX> list = ....;
synchronized (list) {
if (list.contains(objectxy) == false) {
list.add(objectxy);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个填充了ObjectXs的ArrayList.我想在列表中添加一个元素,但前提是列表中不包含相同的元素.我之前检查过(在另一种方法中)如果列表确实包含对象 - 结果为否.但有可能两个线程同时认为结果为no,并且他们都尝试添加objectxy.(还有其他一些必须在中间完成的事情,这就是为什么我无法同步整个过程)
所以,在进程之后,现在线程进入上面的代码片段,我想防止这两个都将对象添加到列表中.所以我想当我同步访问列表时,只有一个线程可以检查它是否包含该对象,然后添加它.在它之后,第二个线程可以访问列表,看到对象已经在其中并且不再添加它.
这就是我想要实现的目标.会有用吗?:-)
所以,如果是的话,我想知道代码片段到底做了什么.是否阻止两个线程同时访问这个确切的代码?这样代码只能同时用于一个线程?
或者它是否一直锁定列表本身,对于此时试图访问列表的应用程序中的任何线程 - 在任何地方?(我的代码中没有其他add(),但是很多得到(),这就是为什么我想知道其他线程是否可以访问列表并且仍然获取元素,而另一个线程正在访问上面的代码).
ArrayList本身是一个成员变量,它使用应用程序与主体连接.如果不是从同一个主体发送的话,多个不同的线程可以同时访问上面的代码是正确的,对吗?
所以,这就是我想知道的.我试图标记我的问题,以便更容易回答它们.谢谢你的帮忙!:-)
[编辑]感谢您的所有答案,几乎所有人都这么说!我觉得现在很清楚!:-)
正确?希望如此 :-)
我使用 Java 中的 ExecutorService 来调用带有invokeAll(). 之后,我得到了结果集future.get()。以与创建线程相同的顺序接收结果非常重要。
这是一个片段:
try {
final List threads = new ArrayList();
// create threads
for (String name : collection)
{
final CallObject object = new CallObject(name);
threads.add(object);
}
// start all Threads
results = pool.invokeAll(threads, 3, TimeUnit.SECONDS);
for (Future<String> future : results)
{
try
{
// this method blocks until it receives the result, unless there is a
// timeout set.
final String rs = future.get();
if (future.isDone())
{
// if future.isDone() …Run Code Online (Sandbox Code Playgroud) Spring Framework中的注释是如何实现的?它们是通过使用依赖注入还是面向方面编程来实现的?
我认为他们使用AOP,因为注释的东西会做一些在其他地方指定的东西.另一方面,像@Autowired @Qualifier("beanID")IS依赖注入一样 - 好吧,也许注释是基于AOP并且可以实现Depedency Injection?它是否正确?
我只是想着它,因为我正在阅读春天的主要部分:di和aop,我想知道注释属于哪里.
我在Java中使用ExecutorService,我注意到了一个我不理解的行为.我使用Callable,当我调用我的线程(实现Callable的类)时,我设置了一个超时.然后我等待结果,future.get()之后我想检查future.isDone()执行任务期间是否发生超时.
正如我在有关超时的invokeAll文档中所读到的那样: returns a list of Futures representing the tasks, in the same sequential order as produced by the iterator for the given task list. If the operation did not time out, each task will have completed. If it did time out, some of these tasks will not have completed.
所以我想我会在两种情况下获得Future结果列表,如果发生超时,如果没有.
现在发生的事情如下:当发生超时时,代码不会继续future.get(),我没有达到可以检查是否发生超时的程度future.isDone().我没有发现任何异常,我直接导致我的代码中的finally块,我真的不明白.
这是我的代码片段:
try {
// start all Threads
results = pool.invokeAll(threads, 3, TimeUnit.SECONDS);
for (Future<String> future : results)
{
try
{ …Run Code Online (Sandbox Code Playgroud) 可能重复:
finally块是否始终运行?
让我们想象以下场景:
public void myMethod() throws MyException
try
{
// do something
// an Exception (for example an individual written MyException which extends
// "Exception" is thrown here
}
catch (OtherException e)
{
// do something
}
finally
{
// do something else
}
}
Run Code Online (Sandbox Code Playgroud)
如果在try块中抛出"MyException"并且不会被捕获 - 它们最终会被阻止,但是,对吗?
如果它是一个运行时异常会被抛出怎么办?最终块会到达吗?
有没有无法到达finally块的情况?
谢谢你的回答:-)
java exception-handling exception try-catch-finally runtimeexception
java ×6
spring ×5
hibernate ×4
mysql ×3
transactions ×3
callable ×2
annotations ×1
arraylist ×1
checkbox ×1
exception ×1
grails ×1
groovy ×1
httpsession ×1
innodb ×1
invoke ×1
myisam ×1
parameters ×1
request ×1
session ×1
spring-aop ×1
synchronized ×1
timeout ×1