什么是事务?
事务是数据库管理系统执行过程中的一个逻辑单位,可以是一个操作或者一组操作。要成功一起成功,要失败一起失败。
举个例子,A 用户去银行给 B 用户转账,如果成功了的花话,那么 A 用户的余额减少,B 用户的余额增加;但是如果银行的网络不好,或者电脑死机等等原因,从而导致 A 用户的余额减少,而 B 用户的余额没有增加,那么这样是不合理的。事务就是确保这样的操作要么都成功,要么都失败。
事务的四大特性:ACID
原子性(Atomicity):事务作为一个整体被执行,其中数据库的操作要么全部执行,要么全部都不执行。
一致性(Consistency):事务应确保数据库的状态从一个一致性的状态转变为另一个一致性的状态。一致性状态的含义是数据库应满足完整性约束;比如:A 用户和 B 用户一共 88888 ,不管 A 和 B 之间如何转账,转多少次,总额还是 88888,这就是事务的一致性。
隔离性(Isolation):多个事务并发执行时,一个事务的执行部影响其他事务的执行。
持久性(Durability):已经被提交的事务对数据库的修改应该永久保存在数据库中。
事务的隔离级别
READ UNCIMMITTED(读未提交):最低级别,任何情况都无法保证。会出现脏读,不可重复度,幻读。
READ COMMITTED(提交读):读取事务已经提交的数据,可避免脏读,但不能避免不可重复读与幻读。
REPEATABLE READ(可重复读):对同一数据多次读取的结果是一样的,可避免脏读和不可重复读,但不能避免幻读。
SERIALIZABLE(可串行化):最高级别,效率最低;避免脏读,不可重读度与幻读。
MySQL 默认隔离级别是 REPEATABLE READ(可重复读)
Oracle 与 SQL Server 默认是 READ COMMITTED(提交读)
名词解释
脏读:一个事务读取到另一个事务还未提交的数据。针对未提交的数据
不可重复度:一个事务读取到另一个事务修改的数据,导致两次读取的结果不一致。针对其他提交前后,读取数据本身的对比
幻读:一个事务读取到另一个事务插入的数据,导致两个读取的结果不一致。针对其他提交前后,读取数据条数的对比
不可重复读与幻读区别
不可重复读的重点是修改,幻读的重点是新增和删除。
不可重复读①案例:A 用户查看卡里存款还有 88888,这时候 A 的老婆在逛街看中了一套化妆品,然后直接消费了老公 A 卡里的存款 XX,这时A 再次读取卡里存款的时候就不是 88888 了,这就是不可重复读。
幻读①案例:甲查询公司的总人数时是 100 个人,但此时乙又向数据库添加了刚入职的 8 小伙伴,甲再次读取的时候,就变成了 108 个人,这就是幻读。