MySQL事务与并发

事务与并发

事务的ACID

原子性(Atomicity)

  • 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性(Consistency)

  • 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。事务前后都符合逻辑规律,如无论如何转账,转账前后钱的总额不变

隔离性(Isolation)

  • 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

持久性(Durability)

  • 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

并发事务带来的问题

脏读

  • A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作,这时候如果事务B回滚,那么A事务读到的数据是不被承认的。

幻读

  • A事务读取B事务提交的新增数据,会引发幻读问题。幻读一般发生在计算统计数据的事务中,例如银行系统在同一个事务中两次统计存款账户的总金额,在两次统计中,刚好新增了一个存款账户,存入了100,这时候两次统计的总金额不一致。

不可重复读

  • 不可重复读是指A事务读取了B事务已经提交的更改数据。假如A在取款事务的过程中,B往该账户转账100,A两次读取的余额发生不一致。

丢失更新

  • 第一类丢失更新
    • A事务撤销时,把已经提交的B事务的更新数据覆盖了
  • 第二类丢失更新
    • A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失

不可重复读和幻读的区别是:

前者是指读到了已经提交的事务的更改数据(修改或删除),后者是指读到了其他已经提交事务的新增数据。

解决并发事务带来的问题

数据库通过锁机制解决并发访问的问题

  • 根据锁定对象不同
    • 行级锁
    • 表级锁
  • 根据并发事务锁定的关系
    • 共享锁定(共享锁、读锁)
      • 如果事物T对数据A加上共享锁之后,则其他事务只能对数据A加上共享锁,不能加排它锁,而获准共享锁的事物只能读取里面的数据,而不能修改里面的数据。
    • 独占锁定(排它锁、写锁)
      • 如果事物T对数据A加上排它锁之后,则其他事物不能再对数据A加任何操作(也不能再加任何锁),但是获准排它锁的事物既能读取数据,而且还能修改数据

事务的隔离等级

  • 直接使用锁机制管理是很复杂的,基于锁机制,数据库给用户提供了不同的事务隔离级别,只要设置了事务隔离级别,数据库就会分析事务中的sql语句然后自动选择合适的锁。
  • 隔离级别越高,并发性越低
  • 4个数据库事务的隔离级别
    • Read UnCommitted(读未提交)
      • 最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。
    • Read Committed(读提交)
      • 大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。
    • Repeatable Read(重复读)
      • mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。
    • Serializable(序列化)
      • 最高隔离级别。所有事务操作依次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它。
  • 事务的隔离等级的实现,可以参考以下文章
    • https://blog.csdn.net/lanxinglan/article/details/51953304

参考文章链接

https://blog.csdn.net/dengjili/article/details/82468576

https://blog.csdn.net/starlh35/article/details/76445267

https://www.cnblogs.com/balfish/p/8298296.html

你可能感兴趣的:(MySQL事务与并发)