SQL 并发与锁

2021/10/23 2:10:37

本文主要是介绍SQL 并发与锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

并发

MySQL默认的行级锁

当我们在MySQL数据库开启一个事务,并对一行数据进行修改,该行在事务期间被锁定,也就是说除了该事务其余事务无法对该行进行操作。从而保证了数据的安全性。也就是MySQL默认的行级锁。

并发的常见问题和解决方式

事务的隔离级别

  1. 读未提交
  2. 读已提交
  3. 可重复读
  4. 可串行化

脏读

读取到了事务尚未提交的修改后数据。

例如事务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;

死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

  1. 循环等待
  2. 不可剥夺
  3. 互斥性:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。
  4. 请求和保持
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 并发与锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程