问题描述
publicsynchronizedintaaa(){conn.setAutoCommit(false);修改表1数据.executeUpdate()..........修改表2数据.executeUpdate()conn.commit();}publicsynchronizedintbbb(){conn.setAutoCommit(false);修改表2数据.executeUpdate()..........修改表1数据.executeUpdate()conn.commit();}如上所示两个事务处理过程同时访问造成死锁应如何处理
解决方案
解决方案二:
放到同一个类中,让aaa,bbb不能同时执行
解决方案三:
把两个方法放到同一个类中,并且使用单例模式,只创建一个对象,这样就不能同时访问这两个方法了
解决方案四:
我想是在指向aaa或是bbb的时候先同时拿到表1和表2的锁拿不到的则等待!这样能实现吗!!!
解决方案五:
synchronized关键字在方法声明上,代表着是对当前对象加锁,如果两个方法所在的对象不是同一个,则锁是不会发生作用的如果不想做成单例可以这样publicintaaa(){synchronized(XXX.class){conn.setAutoCommit(false);修改表1数据executeUpdate()..........修改表2数据executeUpdate()conn.commit();}}publicintbbb(){synchronized(XXX.class){conn.setAutoCommit(false);//修改表2数据executeUpdate()..........//修改表1数据executeUpdate()conn.commit();}}
解决方案六:
引用4楼wangxf_8341的回复:
synchronized关键字在方法声明上,代表着是对当前对象加锁,如果两个方法所在的对象不是同一个,则锁是不会发生作用的如果不想做成单例可以这样publicintaaa(){synchronized(XXX.class){conn.setAutoCommit(false);修改表1数据executeUpdate()..........修改表2数据executeUpdate()conn.commit();}}publicintbbb(){synchronized(XXX.class){conn.setAutoCommit(false);//修改表2数据executeUpdate()..........//修改表1数据executeUpdate()conn.commit();}}
解决方案七:
楼主,这种设计是要不得的,这样必然会死锁。引用4楼wangxf_8341的回复:
synchronized关键字在方法声明上,代表着是对当前对象加锁,如果两个方法所在的对象不是同一个,则锁是不会发生作用的如果不想做成单例可以这样publicintaaa(){synchronized(XXX.class){conn.setAutoCommit(false);修改表1数据executeUpdate()..........修改表2数据executeUpdate()conn.commit();}}publicintbbb(){synchronized(XXX.class){conn.setAutoCommit(false);//修改表2数据executeUpdate()..........//修改表1数据executeUpdate()conn.commit();}}
这方法可行