事务是指一组数据库操作,要么全部执行成功,要么全部不执行,以保证数据的一致性和完整性。事务通常包括一组SQL语句,这些语句共同完成某个业务流程,如银行转账。
事务的四大特性(ACID)
- 原子性(atomicity): 事务的最小工作单元,要么全成功,要么全失败。
- 一致性(consistency): 事务开始和结束后,数据库的完整性不会被破坏。
- 隔离性(isolation): 不同事务之间互不影响,四种隔离级别为RU(读未提交)、RC(读已提交)、RR(可重复读)、SERIALIZABLE (串行化)。
- 持久性(durability): 事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失。
脏读 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted | ✔️ | ✔️ | ✔️ |
Read committed | × | ✔️ | ✔️ |
Repeatable read | × | × | ✔️ |
Serializable | × | × | × |
读未提交(Read UnCommitted/RU)
- 有脏读问题,一个事务可以读取到另一个事务未提交的数据。这种隔离级别是最不安全的一种。也就是说,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(可能提交也可能回滚),这时,第二个事务来读取这条没有提交的数据,并做进一步的处理,就会产生未提交的数据依赖关系,这种现象被称为脏读。
脏读 | |
事务1 | 事务2 |
START TRANSACTION | START TRANSACTION |
select age from user where id=1;
<res=20> | |
update user set age=30 where id=1; | |
select age from user where id=1;
<res=30> | |
commit; | commit; |
读已提交(Read Committed/RC)
- 有不可重复读问题,一个事务先后读取同一条记录,而事务在两次读取之间该数据被其它事务所修改,则两次读取的数据不同,我们称之为不可重复读。
不可重复读 | |
事务1 | 事务2 |
START TRANSACTION | START TRANSACTION |
select age from user where id=1;
<res=20> | |
update user set age=30 where id=1; | |
commit; | |
select age from user where id=1;
<res=30> | |
commit; |
可重复读(Repeatable Read/RR)
- 有幻读问题,一个事物读可以读取到其他事务提交的数据,但是在RR隔离级别下,当前读取此条数据只可读取一次,在当前事务中,不论读取多少次,数据仍然是第一次读取的值,不会因为在第一次读取之后,其他事务再修改提交此数据而产生改变。因此也成为幻读,因为读出来的数据并不一定就是最新的数据。
- 重复读可以解决不可重复读问题。写到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
幻读 | |
事务1 | 事务2 |
START TRANSACTION | START TRANSACTION |
select count(*) from user where age=30;
<res=1> | |
insert into user(age) values(30); | |
commit; | |
select count(*) from user where age=30;
<res=2> | |
commit; |
串行化(Serializable)
- 所有的数据库的读或者写操作都为串行执行,当前隔离级别下只支持单个请求同时执行,所有的操作都需要队列执行。所以种隔离级别下所有的数据是最稳定的,但是性能也是最差的。数据库的锁实现就是这种隔离级别的更小粒度版本。
- Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
选择合适的隔离级别需要考虑以下几个因素:
- 并发性要求:如果系统并发量较低,选择较低的隔离级别可以提高性能,而对于高并发系统,需要选择较高的隔离级别来确保数据的正确性。
- 数据一致性要求:如果数据的一致性要求比较高,需要选择较高的隔离级别,否则可能会出现脏读、不可重复读等问题。
- 事务的长度和复杂度:如果事务的长度和复杂度较高,需要选择较高的隔离级别来确保数据的正确性。
- 数据库的性能和资源使用:较高的隔离级别可能会对数据库性能和资源使用产生较大影响,需要权衡考虑。
选择合适的隔离级别需要根据具体业务场景和系统需求来进行评估和选择。一般来讲,在企业中主要用RC和RR隔离级别,高并发场景,事务比较简单,一般使用RC。一致性要求比较高的情况一般使用RR。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至2705686032@qq.com 举报,一经查实,本站将立刻删除。原文转载: 原文出处: