数据库03——事务1

36 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

事务的概念和特性?

概念:事务是一个操作序列,是不可分割的工作单位

特性(ACID):

  • 原子性(Atomicity):事务是不可分割的操作单元,所有操作要么全部成功提交,要么全部失败回滚;
  • 一致性(Consistency):事务执行前后数据库的完整性没有被破坏,使数据库保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的
  • 隔离性(Isolation):事务所做的修改在最终提交以前对其它事务不可见(并发执行的事务不相互影响)
  • 持久性(Durability):一旦事务提交成功,对数据的修改是永久性的

mysql中以BEGIN TRANSACTION开始,以ROLLBACK/COMMIT结束

并发一致性问题

  • 脏读(Dirty Read):事务读取了被另一个事务修改但还未提交(进行了回滚或提交)的数据,造成两个事务得到的数据不一致,不符合一致性;(提交读S锁记录锁
  • 幻读(Phantom Read):事务多次查询时,其它事务在这个数据范围内执行了插入操作,导致查询结果不同,不符合隔离性。(可串行化间隙锁);
  • 不可重复读(Nonrepeatable Read):查询某行数据后,再次查询该行数据,数据已经被修改,不符合隔离性。(可重复读S锁);
  • 丢失修改:一个事务对数据进行了修改,提交之前,另一个事务对相同的数据进行了修改,两个事务先后提交,后提交的事务会覆盖先提交的事务的处理结果;(IX锁可解决);

数据库的四种隔离级别?

  • 未提交读Read Uncommited):事务提交前,执行结果对其它事务可见会导致脏读、幻读、不可重复读
  • 提交读Read Commited):事物提交前执行结果对其他事物不可见可避免脏读问题;(MVCC可实现)
  • 可重复读Repeatable Read):可确保事务多次读取同样的数据时得到的结果相同.(默认隔离级别)可避免不可重复读;(MVCC可实现)
  • 可串行化Serializable):强制事务串行执行,使之不可能相互冲突,可避免脏读幻读不可重复读问题。会引起锁竞争,使执行效率下降