并发
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;