SQL 并发与锁
2021/10/23 2:10:37
本文主要是介绍SQL 并发与锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
并发
MySQL默认的行级锁
当我们在MySQL数据库开启一个事务,并对一行数据进行修改,该行在事务期间被锁定,也就是说除了该事务其余事务无法对该行进行操作。从而保证了数据的安全性。也就是MySQL默认的行级锁。
并发的常见问题和解决方式
事务的隔离级别
- 读未提交
- 读已提交
- 可重复读
- 可串行化
脏读
读取到了事务尚未提交的修改后数据。
例如事务A 对于数据进行了更改,比如增加了用户的余额,但是这一行为还没有提交,此时用户看到了自己的余额。然后如果事务A此时撤销了事务,那么用户看到的余额也就是一个垃圾数据,叫做脏读。
不可重复读
我们在同一个事务中多次查询,读到不一样的数据。
比如顾客先读取了自己的余额有10块钱,然后去买东西,交钱之前,他的老婆把十块钱取走了,他交钱的时候发现自己没有钱。
幻读
我们的查询结果的事务先于更新结束,导致我们没有查到一些复合条件的数据。
查看当前隔离级别
SHOW VARIABLES LIKE 'transaction_isolation%'
修改当前隔离级别
--可串行化 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; --可重复读 SET TRANSACTION ISOLATION LEVEL REPEATABLE-READ; --读已提交 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --读未提交 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
全局修改隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
为当前会话和连接设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
- 循环等待
- 不可剥夺
- 互斥性:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。
- 请求和保持
START TRANSACTION; UPDATE ORDER SET STATUS=1 WHERE order_id=1; UPDATE customers SET state='VA' WHERE customer_id=1; COMMIT; -- START TRANSACTION; UPDATE customers SET state='VA' WHERE customer_id=1; UPDATE ORDER SET STATUS=1 WHERE order_id=1; COMMIT;
这篇关于SQL 并发与锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?