原子性 Atomicity
原子性指的指的就是这个操作, 要么全部成功, 要么全部失败回滚不存在其他的情况
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态, 也就是说一个事务执行之前和执行之后都必须处于一致性状态
举个例子就是 A 和 B 的钱是 1000 元, A 给你 100 元, 无论最后双方转了多少次, 总的钱一定是 1000 元
隔离性(Isolation)
隔离性是当多个用户并发访问数据库时, 比如操作同一张表时, 数据库为每一个用户开启的事务, 不能被其他事务的操作所干扰, 多个并发事务之间要相互隔离
持久性(Durability)
持久性是指一个事务一旦被提交了, 那么对数据库中的数据的改变就是永久性的, 即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作
并发操作几个问题
在事务的并发操作中可能会出现脏读, 不可重复读, 幻读
脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据
比如 A 转账给 B100 元, 然后还没有提交成功, 这个时候, 你用 B 用手机付款, 这个事务读取到这个 100 了然后就行了扣款, B 读到的这个数据就是脏数据因为 A 没有提交, 可能会撤销
不可重复读
不可重复读是指在对于数据库中的某个数据, 一个事务范围内多次查询却返回了不同的数据值, 这是由于在查询间隔, 被另一个事务修改并提交了不可重复读一般是 update 操作
举例: 比如 A 事务 读取了一个记录, 然后此时 B 事务修改了这个记录会提交了, A 事务再进行读取的时候就会跟之前的记录不一样 会产生我们说的 ABA 问题
幻读
幻读是事务非独立执行时发生的一种现象例如事务 T1 对一个表中所有的行的某个数据项做了从 1 修改为 2 的操作, 这时事务 T2 又对这个表中插入了一行数据项, 而这个数据项的数值还是为 1 并且提交给数据库而操作事务 T1 的用户如果再查看刚刚修改的数据, 会发现还有一行没有修改, 其实这行是从事务 T2 中添加的, 就好像产生幻觉一样, 这就是发生了幻读 幻读一般是 insert 操作
举例: 程序员某一天去消费, 花了 2 千元, 然后他的妻子去查看他今天的消费记录(全表扫描 FTS, 妻子事务开启), 看到确实是花了 2 千元, 就在这个时候, 程序员花了 1 万买了一部电脑, 即新增 INSERT 了一条消费记录, 并提交当妻子打印程序员的消费记录清单时(妻子事务提交), 发现花了 1.2 万元, 似乎出现了幻觉, 这就是幻读
四种隔离
数据库事务的隔离级别有 4 种, 由低到高分别为 Read uncommitted Read committed Repeatable read Serializable
Read uncommitted 未提交读
最低的隔离, 就是可以读取到未提交的数据会产生脏读
A 给 B 转账 1000 元开启事务, 还没提交 此时 B 查看自己余额多了 1000 元但是突然 A 输错了密码放弃了转款, 回滚此时这个 B 看到 1000 元就是一个脏数据, 因为事务没有提交完成
Read committed 提交读
就是一个事务要等另一个事务提交后才能读取数据
比如 A 的卡里有 1000 元去请吃饭花付钱需要花 900 元然后此时他媳妇 B 取出了 500. 当结账的时候, 就会出现付款失败出现这种情况, 就是因为出现了 B 取钱的时候, 没有等待 A 刷卡这个事务完成, 而自己的事务开始读取和提交了数据
Repeatable read 重复读
重复读, 就是在开始读取数据 (事务开启) 时, 不再允许修改操作 MySQL 默认的事务隔离级别是 Rr 重复读
比如上面的例子当 A 进行付款的时候, B 取款的操作就应该等待, 不允许进行修改
Serializable 序列化
Serializable 是最高的事务隔离级别, 在该级别下, 事务串行化顺序执行, 可以避免脏读不可重复读与幻读但是这种事务隔离级别效率低下, 比较耗数据库性能, 一般不使用
序列化就是将并行的操作改成顺序执行
来源: https://www.cnblogs.com/tl542475736/p/8642160.html