小弟最近在学习多线程编程遇到一个问题,要求trans表中不能存在VoucherNo和TransFlag都相同的记录,
表设计的时候VoucherNo和TransFlag字段不是unique的,由于是多线程编程,所以我把判断表中是否存在VoucherNo,TransFlag与要插入的数据的值相同的sql语句和保存语句放在同步代码块中。
代码如下:synchronized (this) {
int count = transdao.getVoucherCount(trans.getVoucherNo(),trans.getTransFlag());//查询
if (count > 0) {//已经存在 return 2;
}
save(trans);
}但是测试的时候还是会出现多条VoucherNo和TransFlag多相同的记录,请问高手是怎么回事啊?是不是因为数据库连接池也是多线程的所以在同步代码块中不起作用?急等高手回答。
表设计的时候VoucherNo和TransFlag字段不是unique的,由于是多线程编程,所以我把判断表中是否存在VoucherNo,TransFlag与要插入的数据的值相同的sql语句和保存语句放在同步代码块中。
代码如下:synchronized (this) {
int count = transdao.getVoucherCount(trans.getVoucherNo(),trans.getTransFlag());//查询
if (count > 0) {//已经存在 return 2;
}
save(trans);
}但是测试的时候还是会出现多条VoucherNo和TransFlag多相同的记录,请问高手是怎么回事啊?是不是因为数据库连接池也是多线程的所以在同步代码块中不起作用?急等高手回答。
synchronized (this) {
改成synchronized (this.getClass()) {因为运行的时候,有很多个"this". 每个this都不是同一个object,所以你的锁没有达到效果。如果你锁getClass()这个对象,因为这个类的所有对象的getClass都是得到同一个“东西”,所以运行时,这个锁是唯一的。