事务执行期间 抛出异常 系统自动回滚;
设置事务回滚点 可以回滚到指定位置;
事务的四大特性:
ACID 原子性(Atomicity) 一致性(consistency) 隔离性(Isolation) 持久性(Durability)
事务的隔离级别:
不同的隔离级别 避免不同的问题
演示脏读:
1. a窗口
set transaction isolation level read uncommitted;
select @@tx_isolation;
start transaction;
select * from account;
转b窗口
select * from account;
发生脏读
2. b窗口
start transaction;
update account set money=money+100 where name='aaa';
转a窗口
演示避免脏读、出现不可重复读:
1. a窗口
set transaction isolation level read committed;
start transaction;
select * from account;
转到b窗口
select * from account;
转到b窗口
select * from account;
发生不可重复读
2. b窗口
start transaction;
update account set money=money+100 where name='aaa';
转到a窗口
commit;
转到a窗口
演示避免脏读、不可重复读、出现虚读:
1. a窗口:
set transaction isolation level repeatable read; (MYSQL 默认隔离级别)
start transaction;
select * from account;
转到b窗口
select * from account;
转到b窗口
select * from account;
转到b窗口
select * from account;
发生虚读
2. b窗口:
start transaction;
update account set money=money+100 where name='aaa';
转到a窗口
commit;
转到a窗口
start transaction;
insert into account(name,money) values('rrr',1000);
转到a窗口
READ UNCOMMITTED 读取其他事务的修改和没有提交的修改
READ COMMITTED 读取其他事物的修改
REPEATABLE READ 锁住事务访问的数据行 但不能防止新行的插入 会导致幻读
SERIALIZABLE 事务串行化了 当然没啥问题了~~~