请问如何设置这样的事务,并且如何检测。这样的一个需求:
当一个用户在对某条记录进行update的时候,若另一个用户正好想select这条记录,要求能显示“该条记录正在被操作,请稍候再试。”我是这样写的:
try{
//执行select()
}catch(SQLException ex){
//此处如何检测抛出的SQLException是由事务引发的,而不是由其他情况引发的?
}
不知道思路是否正确,或者有其他的实现方法?
当一个用户在对某条记录进行update的时候,若另一个用户正好想select这条记录,要求能显示“该条记录正在被操作,请稍候再试。”我是这样写的:
try{
//执行select()
}catch(SQLException ex){
//此处如何检测抛出的SQLException是由事务引发的,而不是由其他情况引发的?
}
不知道思路是否正确,或者有其他的实现方法?
而同一时间 查询 也往数据库发送SQL请求
既然都是往数据库 发送请求 那么就可以判断 如果是事务请求时 并带有查询语句 就像你说的 抛出个异常 说此记录正在被处理
我觉得很多多用户操作的是提交时确定是否脏读。表增加version字段,每次更新操作,检查自己手中的version是否与表中的version一致,不一致不允许更新,证明读到了脏数据。
你正在写贴子准备抢沙发
而另外一个人正在写并且已经完成,发送了他抢了沙发
你发贴的时候是否看到沙发被占用了呢?还有你打开同一个。TXT文件打开两个窗口
你在一个窗口修改文件,难道你在另一个窗口可以看到你的文件被修改了吗?--没有以上两问题解决办法
CSDN只允许一个人打开该贴子并等他发完一个文件只能用一个窗口打开文件共享到局域网的时候别人不能打开你说的问题只有这样
在数据库加
悲观锁
一次只允许一个人做完之后才允许其他用户使用该表或行;
特点
1、不能并发 2、可移植性差;
有效保证数据。关于悲观锁网上应该有很多列子 帮你搜了个--请参考(http://voole.javaeye.com/blog/347356)
而是 比如 这个版块有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结果集存在脏读。不知道各位大大明白我的意思了没有。
加锁后 JDBC该如何检测这条记录被加锁了呢
查看是否有所存在。。
SQL语句?
这条SQL不是很懂,在JDBC里面执行这条语句返回的是什么结果?能不能讲详细点?谢谢!
你到sqlplus中执行下这条sql语句,就知道返回什么结果了,查看是否有所得存在。