我正在使用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还是两者兼而有之?
感谢您的回答! : - )
答案 0 :(得分:5)
1)是否正确,mySQL Server本身指定了如何处理事务?这意味着它决定何时需要锁定记录?
在本质上 - 是的,交易的实施是DBMS的责任
2),3)......
readOnly
与事务无关,它是Hibernate的一个暗示,它说Hibernate不应该将对加载的对象所做的更改传播到数据库(即,如果你的事务,你可以将它指定为性能提示不打算将更改写入数据库)
4)什么时候提交?成功交易或会话结束后?
Commit是一个终止事务的动作(另一个这样的动作是回滚),因此它发生在事务结束时。
5)hibernate-session什么时候开始?每个会话(服务器和客户端之间)或每个事务?
默认情况下 - 对于每个事务,除非您在View支持中配置了Open Session。
最后,谁负责交易管理? spring或mysql还是两者兼而有之?
数据库提供事务行为的实现。 Spring通过定义边界并触发提交/回滚来管理事务。