0%

数据库(六)-事务

事务

事务管理是原子操作,是加锁的,并发执行,如果隔离不合理,可能会出现脏读、不可重复读、幻读(更新3次,结果却更新了4次)

四个隔离级别 可序列化等

https://developer.aliyun.com/article/743691

set autocommit=0开启事务

commit roll back结束事务

隔离级别:多个用户之间,你是否有影响

  1. 读未提取(READ UNCOMMITTED)
    允许的用户最多
    读到别人未提交的数据

  2. 读已提取(READ COMMITTED)
    允许的用户次之

    读到别人已提交的数据

  3. 可重复读(REPEATABLE READ)
    允许的用户再次之

    保证不会出现不可重复读

  4. 可串行化(SERLALZABLE)
    允许的用户最少

    保证不会出现幻读


事务并发可能出现的问题:

  • 脏读(Dirty Read)
    • 一个事务读到了另一个未提交事务修改过的数据
    • 就是两个用户都先后开始了事务操作,其中一个人进行操作的时候,读取到另一个人修改后的操作,而另一个人的修改操作还未完成,这就叫脏读
    • 如果允许脏读,就要把隔离级别设到最低,READ_UNCOMMITTED
  • 不可重复读(Non-Repeatable Read)
    - 一个事务只能读到另一个已经提交的事务并修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值。(不可重复读在读未提取和读已提取隔离级别都可能会出现)
    - 在READ_COMMITTED中,可以读到别人提交的事务,进行同样的操作后,读取后的数据不一样

  • 幻读
    • 在可重复读级别下,
    • 进行事务操作,更新操作看不到,但是可以看到新增的插入操作结果
    • 解决方法:用最高的隔离级别:可串行化

四种隔离级别比较

image-20220608193503585

-------------本文结束感谢您的阅读-------------