java多线程操作mysql,同时更新或者删除操作线程安全吗?

编程入门 行业动态 更新时间:2024-10-03 14:31:06

java多线程<a href=https://www.elefans.com/category/jswz/34/1770947.html style=操作mysql,同时更新或者删除操作线程安全吗?"/>

java多线程操作mysql,同时更新或者删除操作线程安全吗?

1.简单创建一张表

CREATE TABLE `user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`username` varchar(32) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.插入几条数据

INSERT INTO `user` VALUES (1, '张三', 18);
INSERT INTO `user` VALUES (2, '李四', 19);
INSERT INTO `user` VALUES (3, '王五', 18);
INSERT INTO `user` VALUES (4, '赵六', 18);
INSERT INTO `user` VALUES (5, '孙七', 19);
INSERT INTO `user` VALUES (6, '王八', 20);

3.开始测试,navicat新建查询,新建2个查询窗口

4.窗口1执行以下语句,开启事务,更新id=1的年龄

start TRANSACTION;
update user set age = 100 where id = 1;

窗口2执行以下语句,更新id=1的年龄

update user set age = 99 where id = 1;

窗口1执行结果

窗口2等待超时后的执行结果

看得出,一直等待了50多秒都没有获得锁,所以不会执行窗口2的更新语句,也就是更新同一条数据的时候是线程安全的,如果窗口2执行的是偶,窗口1commit的话,窗口2便能更新成功。

虽然是线程安全的,可不要执行update …where id = xx。因为同时执行的话,前一条执行完后面一条也会执行,所以一般是更新的时候会价格乐观锁。比如这里,如果窗口1执行

update user set age = 100 where id = 1;

窗口2执行

update user set age = 99 where id = 1;

最终结果会是99
如果我们希望年龄更改后就不能再更改了,可以这样
窗口1

update user set age = 100 where id = 1 and age = 18;

窗口2

update user set age = 99 where id = 1 and age = 18;

这样年龄就只能更新一次了,这样才能应对java高并发问题。
不过千万要注意的是,读操作是不加锁的,更新的时候虽然加了写锁,但是读还是正常的,所以更新的时候进行读操作是线程不安全的,读取到的数据是旧的,如果只是纯粹的读取倒没什么影响,读取有滞后性很正常,就像秒杀商品,你看到的时候还有数量,但是下单后却发现卖完了

更多推荐

java多线程操作mysql,同时更新或者删除操作线程安全吗?

本文发布于:2024-02-28 00:52:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766937.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:操作   线程   多线程   java   mysql

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!