设置手动提交与事务隔离等级为read uncommited,并开启事务(注意要先设置事务等级再开启事务).
set autocommit=0;set session transaction isolation level read uncommitted;start transaction;

(1) 引发脏读


(2) 引发幻读


(3) 引发不可重复读



2.二级封锁协议
set session transaction isolation level read committed;
(1) Read committed
a.避免脏读
开启一个事务并更新值,在这个事务中money=100(更新后).

另一事务中money为未更新前的值,这就避免了脏读.

b.引发幻读


c.引发不可重复读

事务修改并提交:

出现不可重复读.
(2) Repeatable read
Repeatable read比Read committed严格一点,是Mysql的默认级别,读取过程更多地受到MVCC影响,可防止不可重复读与脏读,但仍有可能出现幻读.
a.避免脏读
在一个事务中修改数据,不提交.

另一事务中两次select的结果都不变,没有出现脏读.

b.避免不可重复读
一个事务修改数据并提交.

另一事务中select的结果没有发生改变,即没有出现不可重复读.

c.引发幻读
同理,一个事务插入一条数据并提交.

另一个事务插入时出现幻读.

三级封锁协议,在一级封锁协议的基础上(修改时加X锁),读数据时加上S锁(与二级类似),但是直到事务结束后才释放S锁,可以避免幻读,脏读与不可重复读.三级封锁协议对应的隔离级别是Serializable.先设置Serializable隔离级别.
set session transaction isolation level serializable
a.避免脏读

b.避免幻读
插入时直接阻塞,避免了幻读.

c.避免不可重复读
在脏读的例子中可以知道,update会被堵塞,都不能提交事务,因此也避免了不可重复读.
4.两段锁协议
事务必须分为两个阶段对数据进行加锁与解锁,两端锁协议叫2PL(不是2PC),所有的加锁都在解锁之前进行.
(1) 加锁
加锁会在更新或者
select *** for update*** lock in share mode
时进行.
(2) 解锁
解锁在事务结束时进行,事务结束包括rollback与commit.




