论坛首页 Java企业应用论坛

Hibernate与事务处理

浏览 27118 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-07-18  

chillwarmoon 写道:
atomicity是说明事务处理过程中不能够被打断;consistency是指事务所操作的数据是一个一致性的集合,也就是这些数据对于其他并发进行的事务是隐藏的;




个人觉得有些值得商榷的,提出来讨论。

1,atomicity,我认为 atomicity 强调的是事务中操作的整体性。也就是,要么所有操作都做,要么所有操作都不做,决不能出现只做一部分操作而另一部分不做的情况。

一个事务,我觉得是可以被“打断”的。具体表现就是 thread 暂时被挂起来。如果事务不能被“打断”,谈何“并发事务”?

2,consistency,我认为 consistency 指的是事务执行前后的系统状态必须保持“一致”。比如说,某一事务中涉及到了户头之间的转账。那么,consistency 就是说,不管有多少户头参与了转账,也不管转了多少钱,最终总的钱数目必须与事务执行前的总数目一致。---- 当然,不考虑跨银行转账的问题。

“事务所操作的数据必须对其它并发事务隐藏”是什么意思呢?难道是说,其它事务不能读取这些数据吗?我认为不是的。具体说来,其它事务能不能读取当前事务所操作的数据,涉及到事务隔离的级别,也就是你后来说的那一段。
1 请登录后投票
   发表时间:2007-07-18  
多线程开发的数据库应用的时候,一定要注意这个阿。。当时我们的一个项目,是用hiberate的
这个两个配置: <!-- transaction api -->
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>

<!-- Bind the getCurrentSession() method to the thread, session-per-conversation -->
<property name="current_session_context_class">thread</property>

当时,测试的时候,用户快速的双击按钮,数据库中就会出现两条重号记录,当时还以为是程序问题,因为有select ** forupdate,但是两个线程,还是有重号记录,后来调查mysql,发现mysql,默认的事物隔离:
是READ UNCOMMITTED
   这种隔离级别下,事物A,读不到事物B插入的数据,
当改称READ COMMITTED的时候,就好用了。。希望大家分享一下,

前提条件是表类型是;InnoDB


查看和设置mysql事物隔离命令:
SELECT @@global.tx_isolation;
SELECT @@tx_isolation;


SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL
                       {READ UNCOMMITTED | READ COMMITTED
                        | REPEATABLE READ | SERIALIZABLE}
0 请登录后投票
   发表时间:2007-07-18  

非典型程序员 写道:

chillwarmoon 写道:
atomicity是说明事务处理过程中不能够被打断;consistency是指事务所操作的数据是一个一致性的集合,也就是这些数据对于其他并发进行的事务是隐藏的;




个人觉得有些值得商榷的,提出来讨论。

1,atomicity,我认为 atomicity 强调的是事务中操作的整体性。也就是,要么所有操作都做,要么所有操作都不做,决不能出现只做一部分操作而另一部分不做的情况。

一个事务,我觉得是可以被“打断”的。具体表现就是 thread 暂时被挂起来。如果事务不能被“打断”,谈何“并发事务”?

2,consistency,我认为 consistency 指的是事务执行前后的系统状态必须保持“一致”。比如说,某一事务中涉及到了户头之间的转账。那么,consistency 就是说,不管有多少户头参与了转账,也不管转了多少钱,最终总的钱数目必须与事务执行前的总数目一致。---- 当然,不考虑跨银行转账的问题。

“事务所操作的数据必须对其它并发事务隐藏”是什么意思呢?难道是说,其它事务不能读取这些数据吗?我认为不是的。具体说来,其它事务能不能读取当前事务所操作的数据,涉及到事务隔离的级别,也就是你后来说的那一段。



你解释的atomicity和consistency都很好,我可能在问题的表述方面还是有些模糊。
0 请登录后投票
   发表时间:2007-07-19  
事物只是对数据库的操作而言的吗?希望知道的人给我一个答案,谢谢;
0 请登录后投票
   发表时间:2007-07-19  
看得有点头大,有些实例就好了。A、B、(1)、(2)、(3)看得很辛苦。
0 请登录后投票
   发表时间:2007-07-19  
spark_zeng 写道
事物只是对数据库的操作而言的吗?希望知道的人给我一个答案,谢谢;



不一定。只不过数据读写是典型的事务处理,所以经常被拿来做例子。
0 请登录后投票
   发表时间:2007-12-04  
不错,谢谢,到javaeye搜索胜过翻书啊
0 请登录后投票
   发表时间:2008-05-14  
我想还是实际代码比较有说服力吧,这样的往上堆文字,会让人看了头痛
0 请登录后投票
   发表时间:2008-05-21  
LZ就讲了隔离级别还有很多没说么
0 请登录后投票
   发表时间:2008-06-21  
谢谢楼主,豁然开朗了不少,就是缺少项目中的例子
1 请登录后投票
论坛首页 Java企业应用版

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