一、数据库事务
事务概念
就是保证数据的一致性
事务ACID特性
原子性
事务是一个完整的操作。事务的各元素是不可分的(原子的)。
事务中的所有元素必须作为一个整体提交或回滚。如果事务中的任何元素失败,则整个事务将失败。
一致性
指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
当事务完成时,数据必须处于一致状态
在事务开始前,数据库中存储的数据处于一致状态
在正在进行的事务中,数据可能处于不一致的状态
但当事务成功完成时,数据必须再次回到已知的一致状态
例:对银行转帐事务,不管事务成功还是失败,应该保证事务结束后表中 A 和 B 的存款总额跟事务执行前一致
隔离性
指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间
对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
持久性
在事务完成以后,该事务对数据库所作的更改会持久的保存在数据库之中,并不会被回滚
指不管系统是否发生故障,事务处理的结果都是永久的
一旦事务被提交,事务的效果会被永久地保留在数据库中
MySQL 及事务隔离级别
innoDB引擎中,定义四种隔离级别,级别越高事物隔离性越好,但性能就越低,而隔离性是由mysql的所和MVCC机制来实现的
read uncommitted(读取尚未提交的数据):有脏读问题
read committed(读取已经提交的数据):有不可重复读问题
repeatable read(重读读取):可以解决脏读 和 不可重复读 —mysql默认的,有幻读问题
serializable(串行化):可以解决 脏读 不可重复读 和 虚读——相当于锁表,上面的问题都可以解决
mysql 默认的事务处理级别是 repeatable read
而 Oracle 和 SQL Server 是 read committed
事务之间的相互影响
脏数据
一个事务读取了另一个事务未提交的数据
而这个数据是有可能会回滚的
不可重复读
一个事务内两个相同的查询却返回了不同数据
这是由于查询时系统中同时有其他事务修改的提交而引起的
幻读
- 一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行
- 而同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据
- 那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样
数据丢失
- 两个事务同时读取同一条记录,A 先修改记录,B 也修改记录(B不知道A修改过)
- B 提交数据后,B 的修改结果覆盖了 A 的修改结果
MVCC
多版本并发控制
可以做到读写不堵塞,避免脏读的问题,通过undo日志链来实现
解决读写并发冲突的,主要就是undo日志版本链来实现,里面有很多版本,读的是不同的版本,写是用copy on write,复制一个副本来进行的写的然后更新的,,有
read committed(读取已经提交的数据):语句级快照 回滚指针,
repeatable read(重读读取):事物级快照, 这条数据和查询的有绑定
当前读
历史的数据叫快照读
脏数据
就是比如一个事务没有执行完,写的时候写了一半但是被别人读到了,这个数据就是脏数据
长事务的影响
并发情况下,数据库
参考了:https://blog.youkuaiyun.com/weixin_51486343/article/details/113408541