锁定老帖子 主题:如果只提交一个查询,有必要用事务吗
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-11-25
sqlMap.startTransaction();; list = sqlMap.executeQueryForList(statementName, parameterObject);; sqlMap.commitTransaction();; } catch (SQLException e); { try { sqlMap.rollbackTransaction();; 我以前见到用事务的都是同时处理几个表,只要其中一个操作失败,事务就回滚,但是这段代码和sql文件我都看了,的确只是针对一个表操作,这种情况用事务能带来什麽好处呢,直接写"list = sqlMap.executeQueryForList(statementName"不就行了吗,不把它放到事务中。想不明白,请大家指点! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2003-11-26
Gavin好像多次说过即使是查询也要用事务,说的很坚决呀,搞得我也没了主意。:(
找个数据库专家问问。 引用 Where on earth does everyone get the idea that readonly operations do not require transactions???? I would like to know where this idea originated from! I have never seen ANY book that advocates this. Where did this idea start? |
|
返回顶楼 | |
发表时间:2003-11-26
之所以要用事务,是因为确保一个全有或者全无的操作。
也就是说不能能让事务中的由于某些部分没有执行成功,破坏数据的一致性。 但是查询仅仅是读取,不可能破坏数据库的一致性,为什么要额外耗费的资源来执行事务呢? Gavin也并没有说出,用事务好在哪里啊,仅仅是表明“没有这么用过”。 。。。。 专家继续!:) |
|
返回顶楼 | |
发表时间:2003-12-07
我的看法是:
如果是单单读数据,没必要起事务的。 但如果读数据是在更新数据过程中的,如果把它放在事务外,需要同时处理两个不同性质的数据源,比较麻烦。 |
|
返回顶楼 | |
发表时间:2003-12-07
我认为不需要加事务。其实Hibernate的Transaction就是JDBC Transaction而已,而实际上Hibernate并没有在Transaction上面附加关于PO的状态管理,因此你先问问你自己,假设你不用Hibernate,你只用JDBC写程序,你会在发送一次SQL Select之后进行conn.commit()吗?如果答案不是,那么你一样在Hibernate中不需要加Transaction,事实上我是从来不加的。而且由于数据库CRUD操作90%以上的都是只读的查询,因此如果你给只读查询加上事务控制,经过我的测试证明,速度会有稍微的降低,而数据库的CPU占用率会有明显的上升。
|
|
返回顶楼 | |
发表时间:2003-12-07
不过类似与Gavin King 这么大的牛,为什么不明白这个道理呢?
非要巴查询放在事务中-GavinKing的代码范例就是这么做的。 是不是另有隐情?我到别的地方找找资料,再来跟贴。。。。 |
|
返回顶楼 | |
发表时间:2003-12-07
从数据库的角度来讲,做完Select后,Commit,数据库可以根据这些信息进行隔离级别的优化,有些数据库Manual是建议在Select后进行Commit的。
|
|
返回顶楼 | |
发表时间:2003-12-08
我觉得大部分情况下查询使用transaction不会太伤害性能,那么干吗不让应用更可靠一点呢?不作不必要的优化.特别是查询只要命中了cache,就不会启动事务了
|
|
返回顶楼 | |
发表时间:2003-12-08
使用Transaction确实对性能降低不多,但是会非常明显增加数据库的CPU负载。启动不启动事务和数据库是否命中Cache没有什么关系。只要你提交commit,数据库是一定会提交事务的。而我们知道事务控制即使在数据库端也是比较复杂的。我的理解是对读查询提交事务也许可以保证数据的一致性。例如在多线程频繁读写一块数据的时候,也许就在你select出来的过程中,数据已经被其他写操作修改了。总之,除非那种对实时数据的精确性要求非常的环境,否则我是绝对不会对读查询使用Transaction的。
|
|
返回顶楼 | |
发表时间:2003-12-08
呵呵,原来看过一点代码,记得它好像是在第一次访问数据库时才真正启动事务,如果直接在cache中找到了,就直接返回了,我觉得这是一个需要的基本优化
记错了不会挨骂吧,今天头脑也不清醒 |
|
返回顶楼 | |