使用Spring,Hibernate和mySQL进行事务管理

时间:2011-04-13 13:52:57

标签: mysql hibernate spring transactions innodb

我正在使用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还是两者兼而有之?

感谢您的回答! : - )

1 个答案:

答案 0 :(得分:5)

  

1)是否正确,mySQL Server本身指定了如何处理事务?这意味着它决定何时需要锁定记录?

在本质上 - 是的,交易的实施是DBMS的责任

  

2),3)......

readOnly与事务无关,它是Hibernate的一个暗示,它说Hibernate不应该将对加载的对象所做的更改传播到数据库(即,如果你的事务,你可以将它指定为性能提示不打算将更改写入数据库)

  

4)什么时候提交?成功交易或会话结束后?

Commit是一个终止事务的动作(另一个这样的动作是回滚),因此它发生在事务结束时。

  

5)hibernate-session什么时候开始?每个会话(服务器和客户端之间)或每个事务?

默认情况下 - 对于每个事务,除非您在View支持中配置了Open Session。

  最后,谁负责交易管理? spring或mysql还是两者兼而有之?

数据库提供事务行为的实现。 Spring通过定义边界并触发提交/回滚来管理事务。