mysql 事务隔离级别与锁的使用

事物的隔离级别

事务的隔离级别 脏读 不可重复读 幻读
读未提交 (READ UNCOMMITTED)
读已提交 (READ COMMITTED)
可重复读 (REPEATABLE READ)
串行化 (SERIALIZABLE)

查看提交方式:select @@autocommit; 改为手动提交:set autocommit=0

读未提交

首先开启两个会话,分别设置事物的隔离级别为读未提交:

set session transaction isolation level read uncommitted;

在一个会话中更新一个字段,并未提交,但是在另一个会话中可以看到更新的字段值,属于脏读

读已提交

set session transaction isolation level read committed;

在一个会话中开启一个事务A:beginstart transaction,查询一个字段值,在另一个会话B中修改这个字段值并提交,如果在事务A中再次查询得到了B更新的值,则在一个事务中重复读结果不一致,属于不可重复读

可重复读

set session transaction isolation level repeatable read;

可重复读保证了在一个事务中每次查询的结果都是一致的,只有将此次事务commit;后才能查询到变动的值;

在一个会话中开启事务A,在另一个事务中开启事务B,A中插入id=4的记录并提交,B 中虽然读不到id=4的记录,但是B也插入 id=4 的记录时报错,发生幻读

串行化

set session transaction isolation level serializable;

隔离性实现原理:锁

mysql 中,锁分为:

  • 共享锁(读锁):对已经锁定的对象不能更新,可以读
  • 排它锁(写锁):对已经锁定的对象不能读,也不能更新

mysql 中,锁的粒度:

​ 记录(行),表,数据库

您的支持鼓励我继续创作!