事务
事务定义
一组操作的集合(多条sql的集合),这个集合是一个不可分割的工作单位,它会把集合内的所有操作一起提交,如果提交过程中,有任何一个SQL出现错误,那便会回退到整个事务执行之前的状态,即:要么全部成功,要么全部提交
事务指令
开启事务 start transaction;/begin;/begin work;
提交事务 commit; 执行DDL操作也会提交事务
回滚事务 rollback; 退出session也会回滚
事务的四大特性(ACID)
原子性(Atomicity)
原子性是指一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。这意味着事务中的所有操作要么全部成功,要么全部失败,不会出现部分操作成功的情况。
一致性(Consistency)
一致性是指事务必须是使数据库从一个一致性状态变到另一个一致性状态。即事务的执行不能破坏数据库的完整性约束。
隔离性(Isolation)
隔离性是指一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability)
持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
并发事务问题
脏读
一个事务读取到了另外一个事务还未提交的数据

不可重复读
一个事务先后读取同一条记录,两次的读取结果不同
事务A: 查询余额是400
事务B:修改了余额变成了500,并且提交
事务A:再次查询余额成了500

幻读
一个事务查询某条记录的时候,没有对应的记录,但是插入这条记录的时候,又发现这条事务已经存在。
事务A:查询id为9的记录,没有相应的记录,id为主键
事务B:插入了id为9的记录,并且提交了
事务A:同样插入了id为9的记录,插入报错;再次查询id为9的记录,依然没有相应的记录

幻读和不可重复读的区别
幻读是指结果集条数发生变化,原本没有的已经有的,不可重复读是指某条数据的变化,原来是a变成了b;
不同事务隔离级别可解决的问题

读未提交(Read Uncommitted, RU)
可能会导致脏读、不可重复读和幻读。事务可以读取到其他事务未提交的修改。
脏读

不可重复读

幻读

读提交(Read Committed, RC)
只能读取到已经提交的数据,可以避免脏读。但可能会遇到不可重复读和幻读的问题。
避免脏读

不可重复读

幻读

可重复读(Repeatable Read, RR)
保证在同一事务中多次读取同样的记录结果是一致的,可以避免脏读和不可重复读。但可能遇到幻读问题。
避免脏读

避免不可重复读

幻读

串行化(Serializable, S)
最高的隔离级别,通过强制事务串行执行,避免脏读、不可重复读和幻读。性能最低,但能保证数据的一致性。
避免脏读

避免不可重复读

避免幻读

热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25052
- 42023-09-25浏览数:18521
- 52020-05-11浏览数:17526