先来复习下数据库的事务
事务是数据库提供的一种机制,把一系列的数据库操作作为一个工作单元,要么全部执行成功,要么全部执行失败回滚到这组操作之前的数据库状态,保证数据的完整性一致性。
事务的四个特性A(Atomicity)原子性、C(Consistency)一致性、I(Isolation)隔离性、D(Durability)持久性
A:指的是事务是一组原子操作,要么全部成功,要么全部失败。
C:事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
I:原则上指一个事务的数据中间状态对另外一个事务是不可见的,但是如果坚持原则执行,所有的事务可能需要排队列顺序执行,效率很低。所以隔离性又分为了几个隔离级别,允许在不影响正确性的情况下提高事务的效率。
D:事务提交后,数据应该永久保存在数据库(有可能只是在日志中和内存中而不在磁盘中,但最终还是保存到磁盘中)
要想理解隔离级别,首先要理解事务并发下可能出现的错误情况:脏读、不可重复读、幻读、
脏读:是指一个事物读取了另外一个事务未提交的数据的中间状态。比如A事务修改了X的值但还未提交,此时B事务查询的时候读取到了X被修改的值。
不可重复读:是指同一事务中的两次查询同一个值却得到不同的结果,这是因为读取到了其他事务提交的数据导致的。
幻读:指一个事务得到的数据里面有未操作的数据,比如A事务在修改id<10的所有数据的一列值,此时事务B插入了一条id=9的数据并提交了。事务A拿到的数据就多出来一条未修改的数据。
隔离级别就是为了解决上面的问题,下面再来看看四种隔离级别:
1、READ_UNCOMMITTED(读未提交)
顾名思义,可以读取到未提交的数据,这是最低的隔离级别。解决不了上述三个问题
2、READ_COMMITED(读已提交)
顾名思义,可读取到已提交的内容,明显可以防止脏读的出现。但是不可重复度和幻读解决不了
3、REPEATABLE_READ(重复读取)
顾名思义,可以重复读取并且读到的值是一致的,解决了不可重复度和脏读,但是解决不了幻读。
4、SERLALIZABLE(串行化)
顾名思义,就是一个事务一个事务顺序执行(加锁实现,当锁冲突时,就必须等待锁释放才能进行下一个事务的操作),事务不是并发执行当然不会出现上述三种错误,但是效率极低。这是最高级别的隔离。
事务的启动方式
相关参数设置:set autocommit=0/1 0:表示事务自动提交关闭,需要手动提交事务,否则所有操作将存在与一个长事务中。
开启事务:begin 或者是 start transaction
提交事物:commit
回滚事务:rollback
给大家推荐一个MySQL的实力课程,前阿里资深技术专家林晓斌的技术分享,总共45节课程,总时长大约12个小时。
花费12个小时时间从此不再害怕MySQL,从sql执行的每一个细节到MySQL的事物、索引、锁的机制的理解,将帮助你在工作中解决关于mysql的绝大部分问题。
从此不再问度娘这条sql怎么这么慢!!!哈哈哈
欢迎撩我,大家共同探讨学习MySQL。