java处理高并发时,使用synchronized代码锁防止同时对数据库某一数据的问题。
我现在使用synchronized(Class.某静态属性){//代码块}这种模式对Dao层操作数据库某一条数据操作进行了加锁,为了防止多个访问同时操作同一数据造成数据混...
我现在使用synchronized(Class.某静态属性){ //代码块 }这种模式对Dao层操作数据库某一条数据操作进行了加锁,为了防止多个访问同时操作同一数据造成数据混乱的问题,但是发现虽然加了锁还是会出现数据混乱。已验证没有其他代码逻辑问题。提问使用代码块锁是否无法完全杜绝这个问题?另外,如果hibernate中使用悲观锁是否能解决此问题,经尝试无法解决。再有,使用存储过程加入for update是否能解决此问题?经测试mysql数据库下几乎不生效,实际环境为oracle但是无法进行批量测试。请大神给出明确思路。
展开
2个回答
展开全部
首先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);
}
}
另外,还可以在数据库级别加上锁。数据库本来就支持不同的隔离级别。
比如数据表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一定是把全局静态锁,这样才能保证该对象的多个实例同时操作也能达到同步效果
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询