为了解决并发事务的问题
查看事务隔离级别:
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别:
SET SESSION/GLOBAL TRANSACTION ISOLATION LEVEL{
READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ |
SERIALIZABLE
}
— 修改隔离级别:
set session TRANSACTION ISOLATION LEVEL READ COMMITTED;
注意:
事务隔离级别越高,数据越安全,但是性能越低。
在开发中,我们在选择事务的隔离级别的时候既要权衡数据的安全性,又要考虑效率
模拟各个事务隔离级别下并发问题的:
cmd打开两个客户端:
连接数据库:mysql -hlocalhost -uroot -proot
切换到指定数据库:use hp_mysql;
——————————————————验证不同隔离级别的脏读————————————————
(1)READ UNCOMMITTED:
设置隔离级别: set session TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
1.1 脏读
1.1.1、两个窗口开启事务:start TRANSACTION;
1.1.2、左窗口查询账户表:select from account;
右窗口执行张三账户减少1000元的更新:
update account set money=money-1000 where name=’张三’;
左窗口再次查询账户表:select from account;
(2)READ COMMITTED :
设置隔离级别: set session TRANSACTION ISOLATION LEVEL READ COMMITTED;
2.1.1、两个窗口开启事务:start TRANSACTION;
2.1.2、左窗口查询账户表:select from account;
右窗口执行张三账户减少1000元的更新:
update account set money=money-1000 where name=’张三’;
左窗口再次查询账户表:select from account;
2.1.3、右窗口提交事务:commit
左窗口再查询账户表:select * from account;
——————————————————验证不同隔离级别的不可重复读————————————-
READ COMMITTED会出现不可重复读(一个事物先后读取同一条记录,但两次读取的数据不同,成为不可重复度)
1.两个窗口都开启事务:start transaction;
左窗口查询账户表:select from account;
右窗口更新数据:update account set money=money-1000 where name=’张三’;
左窗口查询账户表:select from account;
———>发现左窗口两次查询的数据不同
为了解决不可重复读,只需要将事务隔离级别升到可重复读:REPEATABLE READ:
设置隔离级别: set session TRANSACTION ISOLATION LEVEL REPEATABLE READ;
两个窗口都开启事务:start transaction;
左窗口查询账户表:select from account;
右窗口更新数据:update account set money=money-1000 where name=’张三’;
左窗口查询账户表:select from account;
———>两次查询的数据是一样的
—————————————————————————演示幻读:——————————————————————————
两个窗口都开启事务:start transaction;
左窗口查询账户表:select from account where id =3;
右窗口插入数据:insert into account(id,name,money) values(3,’张飞’,3000); commit;
左窗口查询账户表:insert into account(id,name,money) values(3,’张飞有点黑’,3000);
左窗口查询账户表任然没有:select from account where id =3;
为了解决幻读,只需要将隔离级别升到SERIALIZABLE
设置隔离级别: set session TRANSACTION ISOLATION LEVEL SERIALIZABLE;
两个窗口都开启事务:start transaction;
左窗口查询账户表:select * from account where id =5;
右窗口插入数据:insert into account(id,name,money) values(5,’张飞5’,3000);
———>右窗口光标停了(阻塞了),因为左窗口正在操作
左窗口插入数据:insert into account(id,name,money) values(5,’张飞5’,3000);
右窗口报主键错误:因为左窗口插入了数据;