mysql数据库中,我用lock锁表后提示错误.劳驾帮忙看一下
答案:2 悬赏:0
解决时间 2021-02-12 10:00
- 提问者网友:写不出迷人情诗
- 2021-02-11 20:44
mysql数据库中,我用lock锁表后提示错误.劳驾帮忙看一下
最佳答案
- 二级知识专家网友:不羁的心
- 2021-02-11 22:13
在 MySQL 中,如果你显式的执行锁定语句(LOCK Tables ...)
那么你必须一次锁定在解锁之前需要访问的所有表,
而且,如果你以读锁定方式锁定的表,则不能对该表进行写操作,也就是说,你使用什么方式进行的锁定,就只能进行什么方式的操作
甚至如果你在 Query 语句中使用了别名,那么在之前的锁定中也必须使用别名
那么你必须一次锁定在解锁之前需要访问的所有表,
而且,如果你以读锁定方式锁定的表,则不能对该表进行写操作,也就是说,你使用什么方式进行的锁定,就只能进行什么方式的操作
甚至如果你在 Query 语句中使用了别名,那么在之前的锁定中也必须使用别名
全部回答
- 1楼网友:社会水太深
- 2021-02-11 23:49
乐观锁与悲观锁不同的是,它是一种逻辑上的锁,而不需要数据库提供锁机制来支持
当数据很重要,回滚或重试一次需要很大的开销时,需要保证操作的acid性质,此时应该采用悲观锁
而当数据对即时的一致性要求不高,重试一次不太影响整体性能时,可以采用乐观锁来保证最终一致性,同时有利于提高并发性
通常,乐观锁采用版本号/时间戳的形式实现:给数据额外增加一个版本号字段进行控制;更新时,若提交的数据所带的版本号与当前记录的版本号一致,则允许变更执行并更新版本号;若不一致,则意味着产生冲突,根据业务需求直接丢弃并返回失败,或者尝试合并
在mysql的实践中,常见的一种使用乐观锁的方法,是在需要使用乐观锁的表中,新增一个version字段
例如:
create table product_amount (
id int not null primary key auto_increment,
product_name varchar(64) not null,
selling_amount int not null,
storing_amount int not null,
version int not null
);
当需要更新销售中的商品数量(selling_amount)时,使用如下的sql语句:
update product_amount set selling_amount = #{selling_amount}, version = #{new_version} where id=#{id} and version = #{old_version};
若该语句返回1,则表示更新成功;若返回0,则表示前后的version不一致,产生冲突,更新失败
对于更新仓库中的商品数据(storing_amount)时,也是同理
不过,这样为每行记录都统一设置一个version字段的乐观锁方式,存在一个问题:上例中,如果同时需要单独对selling_amount及storing_amount进行update(两条sql语句分别单独执行),那么后执行的一条会因为先执行的一条更新了version字段而失败,而这种失败显然是没有必要的,白白浪费了开销
一种比较好的方式是为每个需要乐观锁的字段单独设置版本号,例如对上例的改造:
create table product_amount (
id int not null primary key auto_increment,
product_name varchar(64) not null,
selling_amount int not null,
selling_version int not null,
storing_amount int not null,
storing_version int not null
);
selling_amount和storing_amount分别拥有自己的乐观锁版本号(selling_version和storing_version),更新时分别只关注自己的版本号,这样就不会因为版本号被其它字段修改而失败,提高了并发性
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯