MySQL数据库并发,上锁的问题(共享锁和排它锁)

排它锁: 加锁后,只有当前用户可以对该信息进行修改删除操作,其余用户只能查看,不能修改。

基本语句:

select *from table_name where SNo = “xxx” for update;//行锁

select *from table_name where SNo<>1 for update;//表锁

相信在搜索这个问题的小伙伴们,都有一定的数据库知识,那么也就知道数据库脏读、死锁等问题及原理。

那么话不多说,直接上演示,希望对你有所帮助。

1.首先打开程序文件,Navicat premium(软件,便于管理数据库)。

java中:下面代码即是排它锁的应用。

try {

sql.execute("begin ");

sql.execute(“select *from studentinfo where SNo= “+””“+SNo+”“”+"for update ");

res = sql.execute(“update studentinfo set “+Modify+”=”+“”“+content+”“”+“where SNo=”+“”“+SNo+”“;”);

sql.execute(“commit ;”);

//为什么执行完后就commit,因为我们的增删改锁执行的时间是有限的,当用户执行增删该后立即commit即可,在还未commit的时间段中,由于本用户已经对这一行信息上锁,那么其余用户就不能进行修改才做了!

if (!res){

System.out.println(“更新成功”);

}else {

System.out.println(“更新失败”);

}

} catch (SQLException e) {

e.printStackTrace();

}

首先我们将java中关于SQL commit的操作注释掉,并执行该程序(修改学生的信息):

在这里插入图片描述

如下,在控制台中修改了学生的生日,但是并没有进行commit操作哦!

在这里插入图片描述

然后我们进入Navicat中,也对此表studentinfo中的该学生(1234567890)进行信息操作,注意:这里是行锁,只锁定了学号为1234567890的这一行信息,不是表锁哦。因为这里在加锁的时候有SNo="1234567890"这个学生,若没有则升级为表锁。

在这里插入图片描述

执行这一行更新语句,我们可以发现,其在等待中,并未执行!

在这里插入图片描述

我们将java程序终止

更新语句才成功执行,我们可以发现其等待了15s之久~

这就是因为,前一个用户一直持有者这一行数据的排它锁,在其释放后,其余用户才能进行后续操作。

在这里插入图片描述

在这里插入图片描述

我们查看表中信息,SName的信息成功修改,Birth没有被修改,这是因为我们终止了程序的运行,其没能进行commit提交操作,故而没能修改,若进行了commit操作,数据就可被修改。

在这里插入图片描述

若进行测试,也可以在Navicat premium中建立两个查询,分别执行,进行测试。

当然,命令行中开两个窗口也是一样的。

查询一:

begin;

select *from studentinfo where SNo=“1234567890” for update ;//上锁

delete from studentinfo where SNo=“1234567890”;

//commit//不执行commit操作

查询二:

UPDATE studentinfo SET SName=“aaa” WHERE SNo = “1234567890”;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值