Mysql事务

88 阅读3分钟

Mysql数据库事务的四大特性

  • 原子性:对于一个事务而言,要么执行,要么不执行,这个事务中可以包含多个语句,但是这个事务是作为基本单位来提供给数据库进行修改。
  • 持久性:当一个事务提交之后,他的修改便是永久性的,即便数据库发生了故障,这种已完成的修改也同样奏效。
  • 隔离性:当有多个用户来访问数据库的时候,每个用户都应该开启一个新的事务,各个事务之间是互不影响的。
  • 一致性:一个事务在执行前和执行之后数据库都应该保持一种一致的状态,比如说张三给李四转账了100元,那么李四如果没有增加一百元那么就违反了事务的一致性

Tips:个人的一些理解,原子性强调的可能是事务个体,隔离性强调的是事务之间的关系。

数据库的四大隔离级别

首先明确三个概念:

  • 脏读:简要概括为读取未提交的数据,就是B现在正在进行事务内部语句的执行,但是还没有提交事务(但是此时已经对数据进行了一定的修改)。此时A读取了数据,但是B最终没有提交事务,这种情况便称为脏读。
  • 脏读强调的是读取了未提交的数据,涉及到事务的撤销。
  • 不可重复读:当A开启事务之后,先读取了某一条数据,然后又去进行别的事情,此时在数据库中另一个事务对刚才的数据进行了修改,当A处理完其他事情再回来确认这条数据的时候,读取到的值与先前不同。
  • 不可重复读的特点是在两次读取之间数据遭到了修改(修改值,并未涉及数据量的变化)。
  • 幻读:幻读也涉及到两次的查询,与不可重复读的区别在于,不可重复读是对同一条单一数据进行的读取,而幻读涉及到总量的问题(对应的也是数据库中有新数据插入或者删除)

读未提交(Read uncommitted)

  存在问题:脏读,不可重复读,幻读

读已提交(Read committed)

  存在问题:不可重复读,幻读
  在这种级别下,各种事务只能读取其他事务已经提交的结果,因此可以彻底解决脏读的现象。

可重复读(Repeatable read)(Mysql的隔离级别)

  存在问题:幻读
  在这种隔离级别下,如果一个事务在执行,那么其他事务是不能进行update的操作的,但是允许进行add操作,因此也就解决了不可重复读的问题。由于仍然可以add数据,那么仍然存在幻读的问题。

可串行化(Serializable)

  安全与效率不可兼得,在这种情况下三种问题都不存在,但是性能也大大的降低,一般都不会使用这样的事务隔离级别。