一、事务
1.在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
2.事务事务四大特征(ACID) :
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
3.事务隔离级别 :
- 读未提交:read uncommitted
- 读已提交:read committed
- 可重复读:repeatable read
- 串行化:serializable
1、 read uncommitted
事务A和事务B,事务A未提交的数据,事务B可以读到。
这里读取到的数据叫做“脏数据”。
这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别。
2、 read committed
事务A和事务B,事务A已提交的数据,事务B可以读到。
这种级别可以避免“脏数据”。
这种隔离级别会导致“不可重复读取”。
这种隔离级别高于读已提交。
是Oracle的默认隔离级别。
3、 repeatable read
事务A和事务B,事务A已提交的数据,事务B还是读不到(B事务中,对同一批数据所读取的值始终一致,不会因为A的修改提交而改变)。
这种隔离级别高于读已提交。
mysql的默认隔离级别。
种隔离级别可以避免“不可重复读取”,达到可重复读取。
仍然会导致幻像读。
4、 serializable
事务A和事务B,事务A在做数据操作时,事务B只能等待。
这种隔离级别高于读已提交。
mysql的默认隔离级别。
种隔离级别可以避免“不可重复读取”,达到可重复读取。
仍然会导致幻像读。
① 脏读: 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
② 不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
③ 幻读:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样,幻读是数据行记录变多了或者少了。
简单点总结下他们的区别:脏读是指读取了未修改完的记录,不可重复读指因为被其它事务修改了记录导致某事务两次读取记录不一致,而幻读是指因为其它事务对表做了增删导致某事务两次读取的表记录数不一致问题。
附:
★ 脏读 : 读取了前一事务 未提交 的数据 ;
不可重复读 : 读取了前一事务 提交 的数据;
★ 幻读 与 不可重复读
common :都是读取了另一条已经提交的事务(这点与脏读不同);
differences :
不可重复读 :查询的都是同一个数据项
幻读 :针对的是一批数据整体(比如数据的个数)
不可重复读eg: <当隔离级别设置为Repeatable read 时,可以避免不可重复读>
eg2: 在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。
与此同时,事务B把张三的工资改为8000,并提交了事务。
随后,在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。(大部分数据库缺省的事物隔离级别都不会出现这种状况)
幻读eg:
eg1: 目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
此时,事务B插入一条工资也为5000的记录,并且commit了。
这时,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。
(大部分数据库缺省的事物隔离级别都会出现这种状况,此种事物隔离级别将带来表级锁)
eg2: A将db中all学生的score从数字分数改变为ABCDE等级,但是B就在此时插入了一条具体的分数,当A改完后发现还有一条记录没有改过来,就好像发生了幻觉一样.这就叫幻读.
|