请问如何设置这样的事务,并且如何检测。这样的一个需求:
当一个用户在对某条记录进行update的时候,若另一个用户正好想select这条记录,要求能显示“该条记录正在被操作,请稍候再试。”我是这样写的:
try{   
    //执行select()
}catch(SQLException ex){
    //此处如何检测抛出的SQLException是由事务引发的,而不是由其他情况引发的?
}
不知道思路是否正确,或者有其他的实现方法?

解决方案 »

  1.   

    JDBC的事务不是可以设置允许脏读或不允许脏读么,我就是想设置成不允许脏读,但是不知道在发生脏读的时候JDBC会返回什么样的信息,如何检测是否脏读了?
      

  2.   

        使用乐观锁,然后捕获StaleObjectStateException(好像是这个异常)
      

  3.   

             发错(那个是hibernate的)
      

  4.   

    我猜可不可以这样  因为你修改的时候 往数据库端发送SQL请求 
    而同一时间 查询 也往数据库发送SQL请求
    既然都是往数据库 发送请求  那么就可以判断  如果是事务请求时 并带有查询语句  就像你说的  抛出个异常 说此记录正在被处理
      

  5.   

    脏读现象得看具体数据库的隔离级别了,可以支持read uncommited级别的才可能有脏读现象。oracle你就看不到。
      

  6.   

    我用的是 MYSQL的 数据库 隔离级别是支持的 就是不知道JDBC在处理由于事务而导致的出错时返回的是什么Exception
      

  7.   

    你是想查询时就检测脏读吗?似乎很少这种需求唉。
    我觉得很多多用户操作的是提交时确定是否脏读。表增加version字段,每次更新操作,检查自己手中的version是否与表中的version一致,不一致不允许更新,证明读到了脏数据。
      

  8.   

    我想要的是当一个用户在对某条数据UODATE的时候 另一个想查找这条数据的人能查到被UDATE之前的值 但同时能给出提示信息 “该条记录正在被更新,请稍后查找最新记录” 而不是等待UDATE执行完再执行查找
      

  9.   

    网吧键盘不太好使 打错了几个字 不好意思我想要的是当一个用户在对某条数据UPDATE的时候 另一个想查找这条数据的人能查到被UPDATE之前的值 但同时能给出提示信息 “该条记录正在被更新,请稍后查找最新记录” 而不是等待UPDATE执行完再执行查找
      

  10.   

    根本就没必要你想想CSDN
    你正在写贴子准备抢沙发
    而另外一个人正在写并且已经完成,发送了他抢了沙发
    你发贴的时候是否看到沙发被占用了呢?还有你打开同一个。TXT文件打开两个窗口
    你在一个窗口修改文件,难道你在另一个窗口可以看到你的文件被修改了吗?--没有以上两问题解决办法
    CSDN只允许一个人打开该贴子并等他发完一个文件只能用一个窗口打开文件共享到局域网的时候别人不能打开你说的问题只有这样
    在数据库加
    悲观锁
    一次只允许一个人做完之后才允许其他用户使用该表或行;
    特点
    1、不能并发 2、可移植性差;
    有效保证数据。关于悲观锁网上应该有很多列子 帮你搜了个--请参考(http://voole.javaeye.com/blog/347356)
      

  11.   

    发现楼上各位大大可能都没有明白我的需求 我来解释一下先回17楼 首先我要的不是“发贴的时候能看到沙发被占用”
    而是 比如 这个版块有2个斑竹, 都对帖子有修改的权限, 当其中一个斑竹A对我的帖子执行了修改操作,提交给数据库执行的时候,另一个斑竹B恰好提交了查找的操作给数据库,而我的这个帖子又恰好符合斑竹B的查询条件,理论上我的帖子是结果集中的一个。这个时候存在这样几种结果:
    1、我的帖子不放入结果集,将其他未被操作的结果返回给斑竹B;
    2、我的帖子放入结果集,但放入的是被斑竹A操作之前的值;
    3、阻塞斑竹B的查找请求,等待斑竹A的更新请求COMMIT之后,将最新的结果放入结果集返回给斑竹B。
    现在我的需求倾向于第2种,给出被操作之前的值,但同时要能给斑竹B这样一个提示:“您所查找的结果集中有部分记录正在被其他斑竹更改并尚未提交,未提交的记录已经给您标出,对于这些未提交的记录您可以稍后重新查找”下面解释下我为什么有这样的需求, 如下图:现实时间轴          A斑竹的请求              B斑竹的请求
    0:0:0.0           事务开始                                
    0:0:0.1           update 记录1
    0:0:0.2           update 记录2
    0:0:0.3           update 记录3          select 记录1,4,……     
    0:0:0.4           update 记录4
    0:0:0.5           update 记录5
    0:0:0.6           commit
    那么 当B提交select的时候,尚不知道A的请求何时commit,所以对于这种情况,我不想阻塞B的请求,而是让B能查到,但同时通知B结果集存在脏读。不知道各位大大明白我的意思了没有。
      

  12.   

    这个UPDATE的时候应该加锁吧!不属于事务的概念吧!
      

  13.   


    加锁后 JDBC该如何检测这条记录被加锁了呢
      

  14.   

    desc dba_dml_locks;
    查看是否有所存在。。
      

  15.   


    SQL语句? 
    这条SQL不是很懂,在JDBC里面执行这条语句返回的是什么结果?能不能讲详细点?谢谢!
      

  16.   


    你到sqlplus中执行下这条sql语句,就知道返回什么结果了,查看是否有所得存在。