1.事物特性(ACID)
- 原子性
A
tomicity - 一致性
C
onsistency - 隔离性
I
solation - 持久性
D
urability
备:
1.一致性和持久性是通过双写机制和redolog实现的
2.当事物回滚,通过undolog进行数据的恢愎,保证原子性
2.隔离级别
事务的四个隔离级别,是来解决并发下产生的脏读、不可重复读、幻读等问题
- 脏读 :读到了其它事务的回滚数据
- 不可重复读:同一个事物中,同一记录多次查询数据不一致
- 幻读:同一事物中,同一条件sql多次查询,数据条数变多了
3.查询mysql当前隔离级别
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
1 row in set (0.00 sec)
4.解决隔离性的问题两个手段
- Lock Based Concurrency Control(LBCC)
事物开始操作数据前,对其加锁,阻止其它事务对数据进行修改(当前读)
什么是当前读:SQL读取的数据是最新版本。通过锁机制来保证读取的数据无法通过其他事务进行修改,如:update、delete、insert、select..Lock IN SHARE MODE、select..for update都是当前读。
- Multi Version concurrency Control(MVCC)
事务开始操作数据前,将数据在当下时间点进行一份数据快照(Snapshot)的备份,并用这个快照来提供给其它事务进行一致性读取(快照读)
什么是快照读:SQL读取的数据是快照版本,也就是历史版本.普通的select就是快照读,如:select * from table where col>1 and col<100
5.innodb中锁的分类
-
共享锁(行锁) ==S==hared Locks
共享锁又称读锁,简称S锁。当一个事务对数据加上读锁之后,其他事务只能对该数据加读锁,而无法对数据加写锁,直到所有的读锁释放之后其他事务才能对其进行加写锁。 加了共享锁之后,无法再加排它锁,这也就可以避免读取数据的时候会被其它事务修改,从而导致重复读问题 -
排他锁(行锁) E==x==clusive Locks
他锁又称写锁,简称X锁;当一个事务对数据加上写锁之后,其他事务将不能再为数据加任何锁,直到该锁释放之后,其他事务才能对数据进行加锁。加了排他锁之后,其它事务就无法再对数进行读取和修改,所以也就避免了脏写和脏读的问题。
6.行锁的具体实现
- 临键锁 Next-key Locks
- 间隙锁 Gap Locks
- 记录锁 Record Locks