论坛首页 Java企业应用论坛

如果只提交一个查询,有必要用事务吗

浏览 33709 次
该帖已经被评为精华帖
作者 正文
   发表时间:2003-11-25  
我在Ibatis的代码中看到这样一段:
  sqlMap.startTransaction();;
            list = sqlMap.executeQueryForList(statementName, parameterObject);;
            sqlMap.commitTransaction();;
        } catch (SQLException e); {
            try {
                sqlMap.rollbackTransaction();;


我以前见到用事务的都是同时处理几个表,只要其中一个操作失败,事务就回滚,但是这段代码和sql文件我都看了,的确只是针对一个表操作,这种情况用事务能带来什麽好处呢,直接写"list = sqlMap.executeQueryForList(statementName"不就行了吗,不把它放到事务中。想不明白,请大家指点!
   发表时间: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?
0 请登录后投票
   发表时间:2003-11-26  
之所以要用事务,是因为确保一个全有或者全无的操作。
也就是说不能能让事务中的由于某些部分没有执行成功,破坏数据的一致性。

但是查询仅仅是读取,不可能破坏数据库的一致性,为什么要额外耗费的资源来执行事务呢?

Gavin也并没有说出,用事务好在哪里啊,仅仅是表明“没有这么用过”。
。。。。
专家继续!:)
0 请登录后投票
   发表时间:2003-12-07  
我的看法是:

如果是单单读数据,没必要起事务的。
但如果读数据是在更新数据过程中的,如果把它放在事务外,需要同时处理两个不同性质的数据源,比较麻烦。
0 请登录后投票
   发表时间:2003-12-07  
我认为不需要加事务。其实Hibernate的Transaction就是JDBC Transaction而已,而实际上Hibernate并没有在Transaction上面附加关于PO的状态管理,因此你先问问你自己,假设你不用Hibernate,你只用JDBC写程序,你会在发送一次SQL Select之后进行conn.commit()吗?如果答案不是,那么你一样在Hibernate中不需要加Transaction,事实上我是从来不加的。而且由于数据库CRUD操作90%以上的都是只读的查询,因此如果你给只读查询加上事务控制,经过我的测试证明,速度会有稍微的降低,而数据库的CPU占用率会有明显的上升。
0 请登录后投票
   发表时间:2003-12-07  
不过类似与Gavin King 这么大的牛,为什么不明白这个道理呢?
非要巴查询放在事务中-GavinKing的代码范例就是这么做的。

是不是另有隐情?我到别的地方找找资料,再来跟贴。。。。
0 请登录后投票
   发表时间:2003-12-07  
从数据库的角度来讲,做完Select后,Commit,数据库可以根据这些信息进行隔离级别的优化,有些数据库Manual是建议在Select后进行Commit的。
0 请登录后投票
   发表时间:2003-12-08  
我觉得大部分情况下查询使用transaction不会太伤害性能,那么干吗不让应用更可靠一点呢?不作不必要的优化.特别是查询只要命中了cache,就不会启动事务了
0 请登录后投票
   发表时间:2003-12-08  
使用Transaction确实对性能降低不多,但是会非常明显增加数据库的CPU负载。启动不启动事务和数据库是否命中Cache没有什么关系。只要你提交commit,数据库是一定会提交事务的。而我们知道事务控制即使在数据库端也是比较复杂的。我的理解是对读查询提交事务也许可以保证数据的一致性。例如在多线程频繁读写一块数据的时候,也许就在你select出来的过程中,数据已经被其他写操作修改了。总之,除非那种对实时数据的精确性要求非常的环境,否则我是绝对不会对读查询使用Transaction的。
1 请登录后投票
   发表时间:2003-12-08  
呵呵,原来看过一点代码,记得它好像是在第一次访问数据库时才真正启动事务,如果直接在cache中找到了,就直接返回了,我觉得这是一个需要的基本优化
记错了不会挨骂吧,今天头脑也不清醒
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics