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

我的相关博客:
java代码程序中连接mysql数据库的方法及代码
mysql数据库并发上锁问题,java代码

这是关于怎么在java程序中给数据库表上锁的演示

使用的是共享锁排它锁
共享锁: 加锁后所有用户都可以查看信息,不能修改,直到锁被当前用户释放
基本语句:

select *from table_name lock in share mode;

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

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";

先执行查询一,在执行查询二,等查询二进入到等待后,再在查询一中执行commit操作即可完成演示。

Talk is cheap, show me the code! —— 薪火工作室!

猜你喜欢

转载自blog.csdn.net/qq_52050769/article/details/118096768
今日推荐