update(){
# res表示更新语句影响的行数
int res = 0;
# 无限循环更新
for(;;){
# 查询出当前的version, 假设结果为v1
SELECT version FROM user where uid = 1;
# 更新,设置额外条件version=v1,并同时更新version字段
res = UPDATE user SET name=maxwell, version=v1+1 WHERE uid=1 AND version=v1;
# 说明更新成功
if(res == 1){
break;
}
}
}
tryUpdate(int times){
# res表示在最多times次尝试后,最终是否更新成功
boolean res = false;
for(x in times){
# 查询出当前的version, 假设结果为v1
SELECT version FROM user where uid = 1;
# 更新,设置额外条件version=v1,并同时更新version字段
int i = UPDATE user SET name=maxwell, version=v1+1 WHERE uid=1 AND version=v1;
if(i == 1 ){
res = true;
break;
}
}
return res;
}
update(){
int res = 0;
for(;;){
SELECT time FROM user where uid = 1; # 假设结果为time1
res = UPDATE user SET name=maxwell, time=CURRENT_TIME WHERE uid=1 AND time=time1;
if(res == 1){
break;
}
}
}
tryUpdate(int times){
boolean res = false;
for(x in times){
SELECT time FROM user where uid = 1; # 假设结果为time1
int i = UPDATE user SET name=maxwell, time=CURRENT_TIME WHERE uid=1 AND time=time1;
if(i == 1 ){
res = true;
break;
}
}
return res;
}
updateDisk(){
UPDATE disk SET size = ? WHERE id = 1; --- ①
updateHost();
}
updateHost(){
int size = SELECT SUM(size) FROM disk WHERE host_id = 1; --- ②
UPDATE host SET disk_size=size WHERE id=1;
}
# 初始数据
disk(1, 1, 1500)
disk(2, 1, 500)
host(1, 2000)
updateDisk(){
UPDATE disk SET size = ? WHERE id = 1; --- ①
updateHost();
}
updateHost(){
# 首先查出host的当前磁盘大小
int size = SELECT SUM(size) FROM disk WHERE host_id = 1; --- ②
int initSize = SELECT disk_size FROM host WHERE id = 1; --- ③
# 尝试更新
for(;;){
int count = UPDATE host SET disk_size=size WHERE id=1 AND disk_size=initSize; --- ④
if(count == 1){
break;
}
}
}
# 初始数据
disk(1, 1, 1500)
disk(2, 1, 500)
host(1, 2000)
updateDisk(){
UPDATE disk SET size = ? WHERE id = 1;
updateHost();
}
updateHost(){
int size = SELECT SUM(size) FROM disk WHERE host_id = 1 FOR UPDATE;
UPDATE host SET disk_size=size WHERE id=1;
}