-
事务简介
事务是一组操作的集合,这组操作要么全部执行成功,要么全部执行失败。 -
事务操作
start transction 开启事务;
commit 提交事务;
rollbace 回滚事务; -
事务的四大特征
原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败。
一致性(consistency):事务完成时,必须所有的数据都保持一致。(账户 转账;火车票 买票)
隔离性(isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作的独立环境下运行。(类似并发特性)
持久性(durability):事务一旦提交或者回滚,对数据库中数据的改变都是永久性的。 -
并发事务问题
脏读:一个事务读到了另一个事务没有提交的数据。
不可重复读:一个事务前后两次读取同一条数据,两次读到的数据不同。
幻读:一个事务按条件查询数据时,提示不存在。插入数据时,提示数据已经存在,好像出现了“幻影”。 -
事务隔离级别
read uncommit: 脏读 不可重复读 幻读 问题都会存在。
read commit: 解决脏读问题。
repeatable read(mysql 默认):解决脏读和不可重复读问题。
serialize : 解决脏读、不可重复读、幻读问题 -
事务隔离级别演示
查看数据库的隔离级别:select @@transaction_isolation;
设置数据库的隔离级别:set [session | global] transction isolation level [read uncommit | read commit | repeatable read | serialize ]第一个实验:
set session transaction isolation level read uncommit;
start transaction; 事务A start transaction; 事务B
select * from pc;
update pc set price = 7777 where model = “1001”;【此时没有提交事务】
select * from pc; [读到了事务B没有提交的数据,即出现脏读问题]第二个实验
set session transaction isolation level read commit;
start transaction; 事务A start transaction; 事务B
select * from pc;
update pc set price = 7777 where model = “1001”;
select * from pc; [读不到了事务B没有提交的数据,解决了脏读问题]
start transaction; 事务A start transaction; 事务B
select * from pc;
update pc set price = 7777 where model = “1001”;
commit;
select * from pc; [读到的数据和之前读取的不同,即出现不可重复读问题]
第三个实验
set session transaction isolation level repeatable read;
start transaction; 事务A start transaction; 事务B
select * from pc;
update pc set price = 7777 where model = “1001”;
commit;
select * from pc; [读到的数据和之前读取的相同,解决了不可重复读问题]
commit;
select * from pc; 【提交之后,在去读取,就能看到事务B修改的数据了】
start transaction; 事务A start transaction; 事务B
select * from pc where model = “1001”;[提示不存在]
insert into pc(model,ram,price) values = (“1001”,166,2000 );【插入成功】
commit;
insert into pc(model,ram,price) values = (“1001”,166,2000 );[提示已存在]
select * from pc where model = “1001”;[提示不存在,即存在幻读问题]
第四个实验
set session transaction isolation level serializable;
start transaction; 事务A start transaction; 事务B
select * from pc where model = “1001”;[提示不存在]
insert into pc(model,ram,price) values = (“1001”,166,2000 );【提示不能执行】
insert into pc(model,ram,price) values = (“1001”,166,2000 );【插入成功】
select * from pc where model = “1001”;【可以查到,解决了幻读问题】
commit;
【此时上面insert语句可以执行,但是提示插入失败】