目录
什么是事务
事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。
事务的四大特性
1.原子性:意味着数据库中的事务执行是作为原子粒度。即不可再分,整个语句要么执行,要么不执行。
2.一致性 :即在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
3.持久性 :意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
4.隔离性:事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
那么用什么方式实现事务的隔离性?通常数据库里都是采用锁的机制,保证事务之间的隔离性。
MySql中的锁锁分类:基于锁的属性分类:共享锁(读锁、S锁)、排他锁(写锁,X锁)。基于锁的粒度分类:表锁、行锁(记录锁、间隙锁、临键锁)。基于锁的状态分类:意向共享锁、意向排它锁。
事务并发问题:
在事务并发执行的时候,如果不进行事务隔离,那么就会产生脏写、脏读、
重复读、幻读的问题。
由此我们需要了解事务的隔离级别。
事务的隔离级别
1. READ_UNCOMMITTED 读未提交2. READ_COMMITTED 读提交(不可重复读)3. REPEATABLE_READ 可重复读4. SERIALIZABLE 串行化
注意:每个隔离级别都针对事务并发问题中的一种或几种进行解决,事务级别越高,解决的
并发事务问题也就越多,同时也意味着加的锁就越多,所以性能也会越差。
事务的隔离级别解决的问题
1.READ_UNCOMMITTED:
事务读取:不加锁
事务写入:加写锁
解决问题:脏写
存在问题:脏读,不可重复读,幻读
2.READ_COMMITTED :
事务读取:加读锁(每次select完成都会释放读锁)
事务写入:加写锁
解决问题:脏写、脏读
存在问题:不可重复读,幻读
3.REPEATABLE_READ:
事务读取:加读锁(每次select完成不会释放锁,而是等事务结束后才释放;如果是MySQL的innodb还会加间隙锁)
事务写入:加写锁
解决问题:脏写、脏读、不可重复读,幻读
存在问题:幻读(如果是MySQL的innodb则不存在这个问题)
4.SERIALIZABLE:
不管读取还是修改所有的事务串行化执行,一个事务的执行必须等其他事务的结束。
END