- 事务管理
- 数据库事务的原理
- MySQL事务隔离级别
- 1.Read Uncommitted(未提交读) ru
- 2.Read Committed(提交读)rc
- 3.Repeatable Read(可重复读)rr
- 4.Serializable(可串行化)
- 问题
- 1.脏读
- 2.幻读
#创建银行帐号表
create table bank
(
bid int primary key auto_increment,
account varchar(20),
money int
);
select * from bank;
insert into bank
(account,money)
values
('张三',10000),
('李四',10000);
select * from bank;
#手动开启事务
start transaction;
update bank
set money=money-1000
where account='张三';
select * from bank;
#突然出错
#回滚事务
#rollback; #只能执行一次,回滚之后手动事务就结束了。
select * from bank;
update bank
set money=money+1000
where account='李四';
#手动提交事务
commit;
select * from bank;
代码仅供参考
MySQL事务隔离级别 1.Read Uncommitted(未提交读) ru#事务a #设置事务为未提交读 set session transaction isolation level read uncommitted; #开始手动事务 start transaction; #更新数据 update classInfo set className='111' where classId=1; #回滚事务 rollback; select * from classInfo
#事务b:在另外一个脚本中运行 set session transaction isolation level read uncommitted; select * from classInfo where classId=12.Read Committed(提交读)rc
#事务a #设置事务隔离级别为提交读 set session transaction isolation level read committed; #开启手动事务 start transaction; #在事务中第一次查询数据 select * from classInfo where classId = 1; #在事务中第二次查询数据 select * from classInfo where classId =1; #提交事务 commit;
#事务b(在另外一个脚本中执行) set session transaction isolation level read committed; start transaction; update classInfo set className='111' where classId = 1 commit;3.Repeatable Read(可重复读)rr
#事务a #设置事务隔离级别为可重复读 set session transaction isolation level repeatable read; #开启手动事务 start transaction; #查询编号为10的班级 select * from classInfo where classId=10; #插入班级编号为10的班级 insert into classInfo (classid,className) values (10,'AAA10'); #提交事务 commit; select * from classInfo
#事务b(在另外一个脚本中上运行) set transaction isolation level repeatable read; #开启手动事务 start transaction; #插入编号为10的班级 insert into classInfo (classId,className) values (10,'AAA10'); #提交事务 commit;4.Serializable(可串行化)
#事务a #设置事务隔离级别为可重复读 set session transaction isolation level serializable; #开启手动事务 start transaction; #查询编号为10的班级 select * from classInfo where classId=10; #插入班级编号为10的班级 insert into classInfo (classid,className) values (10,'AAA10'); #提交事务 commit;
#事务b(在另外一个脚本中上运行) set transaction isolation level serializable; #开启手动事务 start transaction; #插入编号为10的班级 insert into classInfo (classId,className) values (10,'AAA10'); #提交事务 commit;问题 1.脏读
#解决脏读问题,提升数据库库隔离级别 #事务a #设置事务为提交读 set session transaction isolation level read committed; #开始手动事务 start transaction; #更新数据 update classInfo set className='111' where classId=1; #回滚事务 rollback; select * from classInfo
#将事务隔离级别提升为提交读 #事务b:在另外一个脚本中运行 set session transaction isolation level read committed; select * from classInfo where classId=12.幻读
#事务a #设置事务隔离级别为提交读 set session transaction isolation level repeatable read; #开启手动事务 start transaction; #在事务中第一次查询数据 select * from classInfo where classId = 1; #在事务中第二次查询数据 select * from classInfo where classId =1; #提交事务 commit; select * from classInfo;
#事务b(在另外一个脚本中执行) set session transaction isolation level repeatable read; start transaction; update classInfo set className='111' where classId = 1 commit;



