需求:记录用户的第一条访问信息到日志表。
日志表为:log_db
代码如下
//开启事务
beginTrans();
try{
//查询日志表中是否有数据(数据库操作)
logData = dbFunc('select * from log_db where user_id=255');
if(logData为空){ //不存在该用户的数据
//向数据库添加
dbFunc('insert into log_db VALUES (255,xxx,yyy,zzz,nnn)');
}
//提交事务
commit();
}catch($e){
//回滚事务
rollback();
}
功能上线后,本以为仅能收到一条user_id为255的访问信息,没想到却收到一堆:
收到的错误结果如下:
log_db表中出现了n条user_id为255的数据:
255,xxx,yyy,zzz,nnn,'20210619_1724'
255,xxx,yyy,zzz,nnn,'20210619_1724'
255,xxx,yyy,zzz,nnn,'20210619_1724'
255,xxx,yyy,zzz,nnn,'20210619_1724'
而且创建时间都是同一秒,应该是并发执行了。
这是为什么?如何解释?
更好的方法不是加锁。
按照你的需求来说,其实根本不必加锁,利用数据库的特性就行:
1、对表增加一个主键,每天用户访问的第一条,默认设置主键为
${userId}-yyyy-MM-dd
2、首先对这个主键进行查询
3、如果查询不到,就插入
这样只有第一条能够插入,其它都会失败,并不需要用到锁,减少了代码量,并且消耗是最小的。
如果是每小时、每周等等同理