锁定老帖子 主题:Hibernate与事务处理
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-18
chillwarmoon 写道: atomicity是说明事务处理过程中不能够被打断;consistency是指事务所操作的数据是一个一致性的集合,也就是这些数据对于其他并发进行的事务是隐藏的;
个人觉得有些值得商榷的,提出来讨论。 1,atomicity,我认为 atomicity 强调的是事务中操作的整体性。也就是,要么所有操作都做,要么所有操作都不做,决不能出现只做一部分操作而另一部分不做的情况。 一个事务,我觉得是可以被“打断”的。具体表现就是 thread 暂时被挂起来。如果事务不能被“打断”,谈何“并发事务”? 2,consistency,我认为 consistency 指的是事务执行前后的系统状态必须保持“一致”。比如说,某一事务中涉及到了户头之间的转账。那么,consistency 就是说,不管有多少户头参与了转账,也不管转了多少钱,最终总的钱数目必须与事务执行前的总数目一致。---- 当然,不考虑跨银行转账的问题。 “事务所操作的数据必须对其它并发事务隐藏”是什么意思呢?难道是说,其它事务不能读取这些数据吗?我认为不是的。具体说来,其它事务能不能读取当前事务所操作的数据,涉及到事务隔离的级别,也就是你后来说的那一段。 |
|
返回顶楼 | |
发表时间: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} |
|
返回顶楼 | |
发表时间:2007-07-18
非典型程序员 写道: chillwarmoon 写道: atomicity是说明事务处理过程中不能够被打断;consistency是指事务所操作的数据是一个一致性的集合,也就是这些数据对于其他并发进行的事务是隐藏的;
个人觉得有些值得商榷的,提出来讨论。 1,atomicity,我认为 atomicity 强调的是事务中操作的整体性。也就是,要么所有操作都做,要么所有操作都不做,决不能出现只做一部分操作而另一部分不做的情况。 一个事务,我觉得是可以被“打断”的。具体表现就是 thread 暂时被挂起来。如果事务不能被“打断”,谈何“并发事务”? 2,consistency,我认为 consistency 指的是事务执行前后的系统状态必须保持“一致”。比如说,某一事务中涉及到了户头之间的转账。那么,consistency 就是说,不管有多少户头参与了转账,也不管转了多少钱,最终总的钱数目必须与事务执行前的总数目一致。---- 当然,不考虑跨银行转账的问题。 “事务所操作的数据必须对其它并发事务隐藏”是什么意思呢?难道是说,其它事务不能读取这些数据吗?我认为不是的。具体说来,其它事务能不能读取当前事务所操作的数据,涉及到事务隔离的级别,也就是你后来说的那一段。 你解释的atomicity和consistency都很好,我可能在问题的表述方面还是有些模糊。 |
|
返回顶楼 | |
发表时间:2007-07-19
事物只是对数据库的操作而言的吗?希望知道的人给我一个答案,谢谢;
|
|
返回顶楼 | |
发表时间:2007-07-19
看得有点头大,有些实例就好了。A、B、(1)、(2)、(3)看得很辛苦。
|
|
返回顶楼 | |
发表时间:2007-07-19
spark_zeng 写道 事物只是对数据库的操作而言的吗?希望知道的人给我一个答案,谢谢;
不一定。只不过数据读写是典型的事务处理,所以经常被拿来做例子。 |
|
返回顶楼 | |
发表时间:2007-12-04
不错,谢谢,到javaeye搜索胜过翻书啊
|
|
返回顶楼 | |
发表时间:2008-05-14
我想还是实际代码比较有说服力吧,这样的往上堆文字,会让人看了头痛
|
|
返回顶楼 | |
发表时间:2008-05-21
LZ就讲了隔离级别还有很多没说么
|
|
返回顶楼 | |
发表时间:2008-06-21
谢谢楼主,豁然开朗了不少,就是缺少项目中的例子
|
|
返回顶楼 | |