小弟对SSH掌握的不好,还在摸索中使用
我以前用hibernate3+struts2做项目,事务的控制由hibernate3来完成,比如用hibernate的乐观锁(version控制)
现在改用spring2.5+hibernate3+struts2, 我看了下spring2.5的reference,是不是事务控制只需要有在spring里申明,不用使用hibernate3的锁机制就可以自己控制并发呢. Spring2.5可以自己搞定事务并发而我们自己只需要去声明事务就可以吗?
谢谢, 希望哪位帮个忙!
[b]问题补充:[/b]
魔力猫咪:对于你的回答我还是比较迷糊耶.
1.如果用Hiberante3.2, 比如Hiberante3.2, 是不是并发控制是自动的?(我看reference上说得"自动版本化").
2.对于魔力猫咪的回答.是不是可以这样理解:spring2在一遇到异常就会自动回滚,就相当于Hiberante的version控制?
3.如果用SSH2框架,不设定事务隔离层级,spring2还是会自己处理并发?
呵呵,刚在摸索阶段,希望大家指点.感激....
[b]问题补充:[/b]
魔力猫咪: 谢谢你中肯的回答>
我现在想要知道的是: 假如我不用spring2, 直接用hibernate3.2,怎么控制事务并发? 乐观锁是没有真正作到并发,这种情况下我的迷惑是:按照hibernate3.2的工作手册说得,有自动version控制,所以我门不需要在POJO里定义version字段,然后用 去映射,对吗?
如果我用到了spring2.按照你的意思就说,sping2只是申明事务而已,并做不到控制并发,实际上还是得由hibernate3.2来控制并发,对吗?那么假如不用hibernate3,spring2本身能控制事务并发吗?
希望给我详细点的回答, 非常盼望.
[b]问题补充:[/b]
老兄,非常感激你的指点,不过我觉得你把我看高了,我其实就是想知道具体如果控制事务并发,这些概念上的东西我根本无法理解,我就是想知道,所谓的乐观锁,是不是一定要这样做:
1.在pojo定义version字段,数据库定义version字段,然后在映射文件?(这好像是hibernate2的做法)
2.到了hibernate3.2后,是不是不需要像1那样做了?
3.你提到的"乐观锁的所谓自动,是只要你定义了乐观锁,Hibernate就会每次在数据变更的时候给你自动增加",如何定义?
4.是不是可以这样理解:不管你用不用spring,只要你用hibernate的乐观锁来控制并发,是不是就得按照1或者3那样做?
请您给我一个具体的做法,抽象的概念实在是理解不了,误见笑哈...
乐观锁必须你告诉框架你要用才可以。现在的JPA也要你定义@Version标签。自动开乐观锁的也有,Grails的GORM就是自动给你增加了乐观锁。自动给每个Domain的数据库对应表加上version字段。所以你使用HIbernate必须按照1的写才有乐观锁。
乐观锁的自动增加就是你每修改一次,乐观锁就会根据定义乐观锁的不同(整形和时间型),进行变更。整形乐观锁会在你每次修改后加1,时间型会把修改时间写入字段。
4是的。必须你来写。所谓自动,就是不用你每次要自己修改Version字段而已。
乐观锁其实并没有控制并发,只是认为基本上不可能出现问题,如果乐观锁发现version不对,就会报异常。这时事务会回滚。
Spring的事务控制是一发现RuntimeException极其子类就会回滚,或者遇到指定的异常回滚。所以你的乐观锁也还是在发挥作用。
如果你要设定事务隔离层级,那么这个是一个底层问题,Spring和EJB都不对此进行设定,这个一般在配置数据源的时候设定。
事务的隔离层次标准是4级,从没有隔离到严格串行。这个隔离标准是由数据库连接池或者JDBC驱动负责的。
只要你设定了,那么系统就会自动按照你的要求控制并发。你也可以用锁行、锁表的办法进行控制。不过Hibernate多使用乐观锁,当然,你要是对隔离要求高的话使用悲观锁更安全,但是速度慢。
我说了,乐观锁其实是没有事务隔离的,Hibernate认为脏数据问题很少发生,所以只用一个字段来帮助确认数据。只要你开了事务,那么乐观锁就会在你读取数据后数据发生改变的时候抛出异常。
Spring的事务只是一个声明,他会根据配置调用Hibernate的或者其他的事务管理。所以其实还是Hibernate在管理事务。
Hibernate分为乐观悲观两种锁。悲观锁就是使用数据库的事务隔离机制。乐观锁的所谓自动,是只要你定义了乐观锁,Hibernate就会每次在数据变更的时候给你自动增加。如果你不定义,那么这个机制是不会启动的。
不错。Spring只是定义了如何控制事务,具体的事务控制是由Spring带的各种事务控制器负责的。这些事务控制器是实际的JDBC、Hibernate、JTA等事务控制的代理。
只要你定义了事务管理器,那么就可以让这些控制器按照你指定的规则调用相应的事务机制控制并发。