该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-14
mysaga 写道 现在回想起来,平常编程的时候,确实习惯了从 hibernate (无2级缓存)里面拿数据,处理,然后更新——那种情形下,很难出现这种多线程访问同一对象的错误,所以在写多线程测试用例的时候,就大意了。。。。。
不是说二级缓存没关系么? nihongye 写道 引用 1.关于hibernate的二级缓存构造出来的对象是线程不安全的
这种说法是不对的,对象不是从缓存直接取出来的,缓存的是分解了的对象,每次取,对象是被重新构造出来的。 至于数据与数据库数据库一致性方面:因为二级缓存本身提供了几种策略,有不一致的也有一致的 |
|
返回顶楼 | |
发表时间:2009-08-15
daquan198163 写道 mysaga 写道 现在回想起来,平常编程的时候,确实习惯了从 hibernate (无2级缓存)里面拿数据,处理,然后更新——那种情形下,很难出现这种多线程访问同一对象的错误,所以在写多线程测试用例的时候,就大意了。。。。。
不是说二级缓存没关系么? 我的意思是说,在 浏览器-服务器 编程环境下,你考虑的一般仅仅是当前用户的访问,自然也就是单线程的环境;在这种情况下,如果 hibernate 没有配置 2 级缓存,你拿出来的对象本身,基本上是不会出现并发线程访问的。 而因为习惯了这种方式,我在开始写这个测试用例的时候,就不小心忽略了对象线程安全的问题。 |
|
返回顶楼 | |
发表时间:2009-08-16
所有的回帖看了一遍,但是也有了一些些疑问。
首先死锁问题可以肯定是出在数据库上面,但是隔离级别都用上串行了,在一个事物未提交前,另一个事物不能开始,这样也能出现死锁吗?又或者我是把这个隔离级别理解错了吗?又或者mysql自身机制问题?不知oracle是否如此。但是我感觉串行就不该有死锁发生. 另外一个问题,针对于这个典型的用例中,悲观锁下是否只有串行的隔离级别才能保证数据的完整性?异或可重复读?幻读? // 将转出户头写入数据库 getDao().update(from); // 将转入户头写入数据库 getDao().update(to); 最后一个问题,采用乐观锁前提是需要保证遵循它自己的机制?如果是这样,那么hibernate的自带的悲观锁是否同样可保证?当然这里指的是单生产环境。 谢谢。 |
|
返回顶楼 | |
发表时间:2009-08-25
最后修改:2009-08-25
引用 在一个事物未提交前,另一个事物不能开始,这样也能出现死锁吗?
在同一个事务为什么不会出现死锁呢? 例如:同一个事务,以下update操作: update 1 update 2 update 1 update 2 commit; LZ有3000个进程随机update就会出现这种状况~Oracle也是一样,应该所有数据库都是这样的,只是解决死锁问题的能力不一样。 |
|
返回顶楼 | |
发表时间:2009-08-25
C_J 写道 引用 在一个事物未提交前,另一个事物不能开始,这样也能出现死锁吗?
在同一个事务为什么不会出现死锁呢? 例如:同一个事务,以下update操作: update 1 update 2 update 1 update 2 commit; LZ有3000个进程随机update就会出现这种状况~Oracle也是一样,应该所有数据库都是这样的,只是解决死锁问题的能力不一样。 不管LZ是否是进程还是线程,最终数据库只是自己维护自己的。 如果像你所说,一个事务都有可能发生死锁,那我是不是可以理解为一个事务是数据库中多个线程来完成的呢?因为一个线程来完成,我想多次拿锁不是问题的。 还是同一个问题:在一个事物未提交前,另一个事物不能开始,串行真的是这样吗? |
|
返回顶楼 | |