当我们在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;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)