事务: 一大堆事情绑在一起做,全部成功才提交,否则就回滚到提交之前的状态
原子性: 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功要么全部失败回滚.
一致性:数据库总是从一个一致性状态装换到另一个一致性的状态.
隔离性:一个事务所做的修改在提交以前, 对其他事务不可见
持久性:一旦事务提交,则其所做的修改将会永久保存到数据库中
Mysql中事务的隔离级别
-
未提交读取 read uncommited
事务中的修改,即使没有提交,也会被其他事务读取,存在脏读和幻读
-
提交读 read commited (大多数数据库默认隔离级别,但MySQL不是)
只能读到其他事务已经提交的数据,解决了脏读,存在幻读
-
可重复读取 repeatable read
在一个事务中能够保证能够获取到一样的数据,理论上依然无法解决幻读, 但是MySQL通过多版本并发控制解 决了幻读.
-
串行化隔离
所有事务串行,最高隔离级别,性能最差
死锁:
两个或多个事务在同一资源上相互占用,并请求对方占用的资源,从而导致恶性循环.
InnoDB引擎能监测到死锁的循环依赖,并立即返回一个错误, 将持有最少行级排他锁的事务回滚
事务日志:
帮助提高了事务的效率. 存储引擎可以通过事务日志, 在重启时自动恢复崩溃后未写回磁盘的数据.
多版本并发控制(MVCC)
-
每行记录后保存两个隐藏列,行的创建时间, 行的过期时间
a. 只查找版本早于当前事务版本的数据行,确保事务读取到的行在开始前已存在
b. 行的删除要么未定义, 要么大于当前事务版本号,确保事务读取到的行在 事务开启之前未删除 -
快照读和当前读
在事务中,执行普通的select查询之后,会创建快照,之后执行相同的select语句查询到的都是之前的快照。
当对数据执行操作时,会执行当前读,获取最新的数据。 -
并发更新
事务A提交前,会一直由排他锁,此时事务B对数据的更新会阻塞,只有事务A提交或回滚之后,事务B才能获得排他锁,进行数据的更新。