论坛首页 Java企业应用论坛

疑惑:有没有人真正用多线程工具(比如groboutils)测试过Spring的事务处理?

浏览 27949 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-08-14  
mysaga 写道
现在回想起来,平常编程的时候,确实习惯了从 hibernate (无2级缓存)里面拿数据,处理,然后更新——那种情形下,很难出现这种多线程访问同一对象的错误,所以在写多线程测试用例的时候,就大意了。。。。。


不是说二级缓存没关系么?
nihongye 写道
引用
1.关于hibernate的二级缓存构造出来的对象是线程不安全的

这种说法是不对的,对象不是从缓存直接取出来的,缓存的是分解了的对象,每次取,对象是被重新构造出来的。
至于数据与数据库数据库一致性方面:因为二级缓存本身提供了几种策略,有不一致的也有一致的
0 请登录后投票
   发表时间:2009-08-15  
daquan198163 写道
mysaga 写道
现在回想起来,平常编程的时候,确实习惯了从 hibernate (无2级缓存)里面拿数据,处理,然后更新——那种情形下,很难出现这种多线程访问同一对象的错误,所以在写多线程测试用例的时候,就大意了。。。。。


不是说二级缓存没关系么?


我的意思是说,在 浏览器-服务器 编程环境下,你考虑的一般仅仅是当前用户的访问,自然也就是单线程的环境;在这种情况下,如果 hibernate 没有配置 2 级缓存,你拿出来的对象本身,基本上是不会出现并发线程访问的。

而因为习惯了这种方式,我在开始写这个测试用例的时候,就不小心忽略了对象线程安全的问题。
0 请登录后投票
   发表时间:2009-08-16  
所有的回帖看了一遍,但是也有了一些些疑问。

首先死锁问题可以肯定是出在数据库上面,但是隔离级别都用上串行了,在一个事物未提交前,另一个事物不能开始,这样也能出现死锁吗?又或者我是把这个隔离级别理解错了吗?又或者mysql自身机制问题?不知oracle是否如此。但是我感觉串行就不该有死锁发生.

另外一个问题,针对于这个典型的用例中,悲观锁下是否只有串行的隔离级别才能保证数据的完整性?异或可重复读?幻读?

        // 将转出户头写入数据库  
        getDao().update(from);  
          
        // 将转入户头写入数据库  
        getDao().update(to);

最后一个问题,采用乐观锁前提是需要保证遵循它自己的机制?如果是这样,那么hibernate的自带的悲观锁是否同样可保证?当然这里指的是单生产环境。

谢谢。
0 请登录后投票
   发表时间:2009-08-25   最后修改:2009-08-25
引用
在一个事物未提交前,另一个事物不能开始,这样也能出现死锁吗?


在同一个事务为什么不会出现死锁呢?

例如:同一个事务,以下update操作:

update 1
update 2
update 1
update 2

commit;

LZ有3000个进程随机update就会出现这种状况~Oracle也是一样,应该所有数据库都是这样的,只是解决死锁问题的能力不一样。
0 请登录后投票
   发表时间:2009-08-25  
C_J 写道
引用
在一个事物未提交前,另一个事物不能开始,这样也能出现死锁吗?


在同一个事务为什么不会出现死锁呢?

例如:同一个事务,以下update操作:

update 1
update 2
update 1
update 2

commit;

LZ有3000个进程随机update就会出现这种状况~Oracle也是一样,应该所有数据库都是这样的,只是解决死锁问题的能力不一样。

不管LZ是否是进程还是线程,最终数据库只是自己维护自己的。

如果像你所说,一个事务都有可能发生死锁,那我是不是可以理解为一个事务是数据库中多个线程来完成的呢?因为一个线程来完成,我想多次拿锁不是问题的。

还是同一个问题:在一个事物未提交前,另一个事物不能开始,串行真的是这样吗?
0 请登录后投票
论坛首页 Java企业应用版

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