一、事务的四大特性
① A atomicity 原子性
事务是原子的,要么都执行,要么都不执行。
② C consistency 一致性
保证数据的一致性,例如数据的约束等,
③ I isolation 隔离性
一个事务的执行对于另外一个事务是不可见的,类似透明的,事务之间是彼此独立的。
④ D durable 持久性
数据保存了就不会丢失
二、事务的隔离级别
① 脏读
当事务a更新数据未提交时,事务b能读到事务a的修改的数据
REATE TABLE `y` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
`c` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
② 不可重复读:
当事务a和事务b同时打开,事务a插入了数据X,事务b查询不到X,当事务a提交了事务,事务b看到了数据X。 事务b两次查询不一致。
③) 幻读:
一次事务在前后两次查询的范围相同,后一次查询看到了前一次没有的行。
幻读主要在当前读的情况下产生的,
当前读: 读取的是最新版本的数据, 并且对读取的记录加锁, 阻塞其他事务同时改动相同记录,避免出现安全问题。
怎么理解了?
上面普通的select * from y; 就是快照读,
下面的 select * from y lock in share mode; 就是当前读,读取的是最新的版本数据。
幻读就是像上面的情况,可能session B 提交前 添加一条数据的时候,
如果上面不会阻塞的话,就会产生幻读。
为了解决幻读mysql并不是通过事务隔离级别serializble串行化来解决的。而是通过间隙锁 (Gap Lock)来解决的。
三、 事务隔离级别的修改
通过变量tx_isolation来定义的。默认是RR的方式,也就是可重复的的隔离级别,如果要修改的话:
set global tx_isolation = 'read-uncommitted'; ##读未提交
set global tx_isolation = 'read-committed'; ##不可重复读
set global tx_isolation = 'repeatable-read'; ## 可重复读
set global tx_isolation = 'serializable'; ## 串行化