锁定老帖子 主题:请教:事务与同步的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-01-10
read方法从表中查询出某列的最大值。 write方法是向表中写入一条数据。 在SERVICE中有一个方法,调用DAO中的read和write方法完成一个操作。 先read,得出的最大值加1后,再调用write方法写入一条数据。 我给SERVICE这个方法定义了事务,但有个疑问: 这样是否会存在同步问题?是不是还要在这个方法前加synchronized来锁定呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2005-01-10
锁资源或者是锁资源使用者,还有版本检查,卡卡
|
|
返回顶楼 | |
发表时间:2005-01-10
如果你程序中使用的变量不是全局变量,那么你不需要考虑同步的问题。另外,将read和write放在同一个事务里面就可以了。
至于锁的问题,在JDBC中,好像还没有可以控制数据库锁的,有的只有事务级别,而且对于应用服务器数据源中数据库链接,事务级别一般不建议由程序设置的。 |
|
返回顶楼 | |
发表时间: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中也有事务隔离级别,是不是同这个差不多?) 你的意见是说,如果不加这些条件的话,是会出现同步问题的,对么? |
|
返回顶楼 | |
发表时间:2005-01-11
凤舞凰扬 写道 如果你程序中使用的变量不是全局变量,那么你不需要考虑同步的问题。另外,将read和write放在同一个事务里面就可以了。
至于锁的问题,在JDBC中,好像还没有可以控制数据库锁的,有的只有事务级别,而且对于应用服务器数据源中数据库链接,事务级别一般不建议由程序设置的。 只要放在一个事务里就可以了,不用关心事务的隔离级别么? |
|
返回顶楼 | |
发表时间: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是否一样,而且每种数据库也有差别的。 不加的话违反数据完整性的可能就会变大,当然你必须要在数据完整性以及性能之间权衡啦 |
|
返回顶楼 | |
发表时间:2005-01-11
可以参考一下Hibernate悲观锁和乐观锁的实现机制,也许有帮助。
|
|
返回顶楼 | |
发表时间:2005-01-16
jdk1.3(weblogic7里面的);,oracle8 synchronize method();{ db.setAutoCommit(false);; select max max +1 ; 插入最大 提交事务 } 同时开四个线程,每个循环10k次,数据库里面发现重复记录 |
|
返回顶楼 | |
发表时间:2005-01-17
楼上的代码本身就存在问题,楼上代码中和事务并没有太多关系,简单地讲,也就是四个线程之间并不存在事务的冲突,楼上的问题属于典型的同步问题,首先,其实就是出现在max ++这里。再讲明晰一点,就是在某一刻,存在多于一个的线程都同时访问select,获得某个max值,然后+1,自然得到的会是相同的。其次,事务的控制是对于CUD操作的,只select具有记录最大值的表是不会锁定它的。
如果希望通过事务来控制,准确地做法应该是在事务范围内首先更新max记录(通过update来加1),然后再insert AXX (a) select max(b) from BXX才可以。 |
|
返回顶楼 | |