MySQL数据库中行锁for update的运用方式详细解答 mysql行格式
大家好,本网站为大家提供优质的、全新的游戏攻略,援助大家更愉悦地、更顺手地玩游戏,走过路过不要错过奥。
在MySQL数据库中,行锁是一种特别重要的机制,能够有效地处理并发事务之间的冲突。其中,行锁for update是比较常用的一种锁机制,本篇文章将详尽介绍它的使用方法。
1. 创建测试表
起首,在MySQL中创建一个测试表,用来模拟并发事务的场景。可以使用以下SQL语句:
```
CREATE TABLE `shoufei` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`shijian` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`xiangmu` varchar(20) NOT NULL,
`jiage` float NOT NULL,
`shuliang` int(11) NOT NULL,
`jine` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINEInnoDB AUTO_INCREMENT6 DEFAULT CHARSETutf8;
```
2. 插入测试数据
然后,向测试表中插入一些数据,可以使用以下SQL语句:
```
INSERT INTO `shoufei` (`id`, `shijian`, `xiangmu`, `jiage`, `shuliang`, `jine`) VALUES
(1, '2019-01-28 11:15:52', '银翘解毒丸', 2, 10, 20),
(2, '2019-01-28 11:15:59', '甘草片', 15, 2, 30),
(3, '2019-01-28 11:16:04', '阿莫西林', 20, 2, 40),
(4, '2019-01-28 11:16:08', '午时茶', 8, 1, 8),
(5, '2019-01-28 11:16:12', '银翘解毒丸', 2, 10, 20);
```
3. 创建两个用户并登录
接下来,在MySQL中创建两个用户abc_1和abc_2,并分别登录MySQL。
4. 使用行锁for update
然后,使用abc_1用户对id2的数据增加行锁:
```
SELECT * FROM shoufei WHERE id2 FOR UPDATE;
```
这个操作会使得其他用户和事务无法再对该行进行加锁,只能等待abc_1用户解锁以后才能进行操作。
接着,abc_1用户对id2的数据修改jiage20:
```
UPDATE shoufei SET jiage20 WHERE id2;
```
此时,abc_1用户没有提交任务,因此只有自己可以看到结果。
5. 查询被锁定的数据
接下来,abc_2用户查询id2的数据,其中jiage没有被修改,因为abc_1用户没有提交任务:
```
SELECT * FROM shoufei WHERE id2;
```
6. 加锁失败
接着,abc_2用户尝试对id2的数据增加行锁,但是却失败了,因为超时并且abc_1用户没有解锁:
```
SELECT * FROM shoufei WHERE id2 FOR UPDATE;
```
7. 提交任务解锁
此时,abc_1用户提交任务commit,即可将id2的数据jiage20,同时也解锁了该行。
8. 加锁胜利
最后,abc_2用户再次查询id2的数据并且加锁,这次加锁胜利,可以查看到abc_1用户修改的数据jiage20:
```
SELECT * FROM shoufei WHERE id2 FOR UPDATE;
```
总结
通过以上试验可以看出,行锁for update是一种特别有用的锁机制,能够有效地保卫并发事务之间的数据不受干扰。但是需要注意的是,若果锁住的时间过长,会影响系统的吞吐量。因此,在实际应用中,应该依据详细状况,合理地选择锁机制。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将即刻删除。
大家注意,牢记持续关注本游戏攻略网站,您的支持是我们最大的动力奥,我们会努力提供全网新的游戏攻略教程,加油。
本创作内容,未授权勿转载,必究权责。
免责说明:本文代表的是网站编辑的观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经确认,因此对本文以及其中全部或者部份内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。