首先我们先了解一下什么是事务:
事务的隔离性和实现方式:
为了让不同的事务之间相互不存在干扰,就需要对事务的操作进行隔离,事务的隔离性也就是将操作同一个数据的事务相互分离,让操作之间分开有序的执行。
通常数据库里都是采用锁的机制,保证事务之间的隔离性。
事务的ACID原则:
1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体。意味着数据库中的事务执行是作为原子粒度。即不可再分,整个语句要么执行,要么不执行。
2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
3、隔离性(Isolation):事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
事务的并发问题:
1.脏写:两个事务没提交的情况下,都修改了同一条数据,结果一个事务回滚了,把另外一个事务修改的值也撤销了,所谓脏写就是两个事务没提交状态下修改同一个值。
2.脏读:你修改了一条数据的值,还没有提交,另一个事务就读到了你修改的值,然后你回滚了,人家事务就读不到你之前修改的值,也就是说人家事务读到了你修改之后还没有提交的值,这就是脏读。
3.不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
4.幻读:比如管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
事务的隔离级别:
查看事务的隔离级别:
设置事务的隔离级别:
另外提醒一点,MySQL 的默认隔离级别是可重复读,不是读已提交。