有c/s b/s的2个项目,操作同一表结构A,表A中有字段count=100
其中
c/s的操作if(count>0){
count=count-100
insertData();
}
b/s的操作if(count>0){
count=count-100
insertData();
}
假设一种可能,c/s和b/s的同时通过验证if(count>0),这样会出现一种情况,count是脏数据了,这是不允许的。
这该如何解决?
有c/s b/s的2个项目,操作同一表结构A,表A中有字段count=100
其中
c/s的操作if(count>0){
count=count-100
insertData();
}
b/s的操作if(count>0){
count=count-100
insertData();
}
假设一种可能,c/s和b/s的同时通过验证if(count>0),这样会出现一种情况,count是脏数据了,这是不允许的。
这该如何解决?
如果对数据库的访问服务是有多台机器的(不同的服务,或者服务部署了集群模式),可以采用如下几种方式之一:
使用程序的方式申请一个全局锁,比如使用Zookeeper就可以实现一个全局锁的功能,获得该锁的授权以后才能继续执行,这样保证对count的计算和insert都是串行执行的,不会存在脏数据;
使用某一个表的一条记录作为行锁(insert本身是无法加行锁的,因为insert之前数据还不存在),比如创建一个名为GLOBAL_LOCK的表,其中只有一条记录(假定有id这样一个字段,记录为id=1),操作之前做:
select id from GLOBAL_LOCK where id=1 for update;
这样也可以保证几个数据库事务本身是串行执行的;
操作之前锁整个表,这个和具体数据库有关
以上两种方式都是基于全局锁的方式,效率比较低,在并发比较高的情况下慎用。
题主的业务逻辑不清楚,如果是需要提高一些效率的话可能需要做一些缓冲的处理,不过要因具体的业务而定。