java处理高并发时,使用synchronized代码锁防止同时对数据库某一数据的问题。

我现在使用synchronized(Class.某静态属性){//代码块}这种模式对Dao层操作数据库某一条数据操作进行了加锁,为了防止多个访问同时操作同一数据造成数据混... 我现在使用synchronized(Class.某静态属性){ //代码块 }这种模式对Dao层操作数据库某一条数据操作进行了加锁,为了防止多个访问同时操作同一数据造成数据混乱的问题,但是发现虽然加了锁还是会出现数据混乱。已验证没有其他代码逻辑问题。提问使用代码块锁是否无法完全杜绝这个问题?另外,如果hibernate中使用悲观锁是否能解决此问题,经尝试无法解决。再有,使用存储过程加入for update是否能解决此问题?经测试mysql数据库下几乎不生效,实际环境为oracle但是无法进行批量测试。请大神给出明确思路。 展开
 我来答
1雨2打3琵4琶
推荐于2017-09-09 · 超过20用户采纳过TA的回答
知道答主
回答量:41
采纳率:0%
帮助的人:38.5万
展开全部
首先synchronized不可能做到对某条数据库的数据加锁。它能做到的只是对象锁。
比如数据表table_a中coloum_b的数据是临界数据,也就是你说的要保持一致的数据。你可以定义一个类,该类中定义两个方法read()和write()(注意,所有有关该临界资源的操作都定义在这个类中),再定义一个静态变量作为锁就可以了。

public static final String LOCK = "table_a_b_lock";

public int read(){
synchronized LOCK{
System.out.println("read data...");
}
}

public void write(String data){
synchronized LOCK{
System.out.println("write data:" + data);
}
}

另外,还可以在数据库级别加上锁。数据库本来就支持不同的隔离级别。
追问
我现在的做法和您给出的第一个回答是类似的。数据库级别行锁for update 没有生效,我用的是悲观锁。不知原因……
追答
你确定对该数据的所有操作是在同一个类?在同一个类中你确定与该资源相关的方法做到了同步?注意,synchronized一定是把全局静态锁,这样才能保证该对象的多个实例同时操作也能达到同步效果
我DE小店铺
2015-01-28 · 超过24用户采纳过TA的回答
知道答主
回答量:138
采纳率:0%
帮助的人:57.1万
展开全部
建议使用数据库会话的事务锁进行控制
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
?>

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式