论坛首页 Java企业应用论坛

请教:事务与同步的问题

浏览 11146 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-01-10  
在DAO中有两个方法,一个read,一个write。
read方法从表中查询出某列的最大值。
write方法是向表中写入一条数据。

在SERVICE中有一个方法,调用DAO中的read和write方法完成一个操作。
先read,得出的最大值加1后,再调用write方法写入一条数据。

我给SERVICE这个方法定义了事务,但有个疑问:

这样是否会存在同步问题?是不是还要在这个方法前加synchronized来锁定呢?
   发表时间:2005-01-10  
不需要吧,三种办法
1 hibernate optimistic lock
2 database row lock, for example oracle select .... for update
3 database optimistic lock, for example oracle serializable isolation level + select
0 请登录后投票
   发表时间:2005-01-10  
锁资源或者是锁资源使用者,还有版本检查,卡卡
0 请登录后投票
   发表时间:2005-01-10  
如果你程序中使用的变量不是全局变量,那么你不需要考虑同步的问题。另外,将read和write放在同一个事务里面就可以了。
   至于锁的问题,在JDBC中,好像还没有可以控制数据库锁的,有的只有事务级别,而且对于应用服务器数据源中数据库链接,事务级别一般不建议由程序设置的。
0 请登录后投票
   发表时间:2005-01-11  
CafeBabe 写道
不需要吧,三种办法
1 hibernate optimistic lock
2 database row lock, for example oracle select .... for update
3 database optimistic lock, for example oracle serializable isolation level + select


1 没采用hibernate,用的原始JDBC。
2 这个可以用,反正这个系统的数据库锁定用oracle了。
3 也是可以的。(EJB中也有事务隔离级别,是不是同这个差不多?)

你的意见是说,如果不加这些条件的话,是会出现同步问题的,对么?
0 请登录后投票
   发表时间:2005-01-11  
凤舞凰扬 写道
如果你程序中使用的变量不是全局变量,那么你不需要考虑同步的问题。另外,将read和write放在同一个事务里面就可以了。
   至于锁的问题,在JDBC中,好像还没有可以控制数据库锁的,有的只有事务级别,而且对于应用服务器数据源中数据库链接,事务级别一般不建议由程序设置的。


只要放在一个事务里就可以了,不用关心事务的隔离级别么?
0 请登录后投票
   发表时间:2005-01-11  
jeffrey_he 写道
CafeBabe 写道
不需要吧,三种办法
1 hibernate optimistic lock
2 database row lock, for example oracle select .... for update
3 database optimistic lock, for example oracle serializable isolation level + select


1 没采用hibernate,用的原始JDBC。
2 这个可以用,反正这个系统的数据库锁定用oracle了。
3 也是可以的。(EJB中也有事务隔离级别,是不是同这个差不多?)

你的意见是说,如果不加这些条件的话,是会出现同步问题的,对么?

1 可以自己实现呀,加一个version字段,update ... where id=? and version=?
3 ejb不熟呀 ,不知道和数据库的isolation level是否一样,而且每种数据库也有差别的。
不加的话违反数据完整性的可能就会变大,当然你必须要在数据完整性以及性能之间权衡啦
0 请登录后投票
   发表时间:2005-01-11  
可以参考一下Hibernate悲观锁和乐观锁的实现机制,也许有帮助。
0 请登录后投票
   发表时间:2005-01-16  
jdk1.3(weblogic7里面的);,oracle8
synchronize  method();{
   db.setAutoCommit(false);;
   select max
   max +1 ;
  插入最大
  提交事务
}

同时开四个线程,每个循环10k次,数据库里面发现重复记录
0 请登录后投票
   发表时间:2005-01-17  
楼上的代码本身就存在问题,楼上代码中和事务并没有太多关系,简单地讲,也就是四个线程之间并不存在事务的冲突,楼上的问题属于典型的同步问题,首先,其实就是出现在max ++这里。再讲明晰一点,就是在某一刻,存在多于一个的线程都同时访问select,获得某个max值,然后+1,自然得到的会是相同的。其次,事务的控制是对于CUD操作的,只select具有记录最大值的表是不会锁定它的。
    如果希望通过事务来控制,准确地做法应该是在事务范围内首先更新max记录(通过update来加1),然后再insert AXX (a) select max(b) from BXX才可以。
0 请登录后投票
论坛首页 Java企业应用版

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