一、事务
两次操作后总和等于0,减500,加500,不能加1000
show variables like '%tx_isolation%';
开始balance=450
查询隔离级别:
show variables like ‘%tx_isolation%’;
设置隔离级别为脏读:
set SESSION TRANSACTION ISOLATION LEVEL read UNCOMMITTED; 一个session中:
开启事务
start TRANSACTION
修改字段值:
update account set balance = balance -50 where id = 1
另外一个session中查询
select * from account (返回400)
然后回到第一个session中 回滚事务 ROLLBACK,然后查询字段已经变成450
在第二个session中 执行
update account set balance = balance -50 where id = 1 查询结果还是 400(正常应该是350)
查询事务隔离级别:
show variables like ‘%tx_isolation%’;
设置隔离级别为不可重复读:
set SESSION TRANSACTION ISOLATION LEVEL read committed;
一个session中
开启事务:
start TRANSACTION
修改balance 的值
update account set balance = balance -50 where id = 1
另外一个session中查询 (数据并没改变)
select * from account
回到第一个session中 提交事务 commit
在第二个session种中
select * from account (数据已经改变)
show variables like ‘%tx_isolation%’;
set SESSION TRANSACTION ISOLATION LEVEL repeatable read;
一个session中
start TRANSACTION
update account set balance = balance -50 where id = 1
另外一个session中查询 (数据并没改变) select * from account
回到第一个session中 提交事务 commit
在第二个session种
select * from account (数据并未改变)【这里是可重复度和读已提交的区别】
account 表有3条记录,业务规定,最多允许4条记录。
1.开启一个事务
begin
select * from account 发现3条记录
2.开启另外一个事务
begin
select * from account 发现3条记录 也是3条记录
insert into account VALUES(4,‘deer’,500)
查询 4条记录
select * from account
3.回到第一个session
insert into account VALUES(5,‘james’,500)
select * from account 4条记录
4.session1 与 session2 都提交事务
在任何一个session中查询时发现有5条记录
设置隔离级别为串行化
set SESSION TRANSACTION ISOLATION LEVEL serializable;
重新执行上面的测试发现插入第五条数据时报错
show variables like ‘%autocommit%’; 自动提交事务是开启的
set autocommit=0;
insert into testdemo values(5,5,5);
savepoint s1;
sert into testdemo values(6,6,6);
savepoint s2;
nsert into testdemo values(7,7,7);
avepoint s3;
select * from testdemo
rollback to savepoint s2 rollback
重新查询时发现记录知道6,6,6