事务执行期间 抛出异常 系统自动回滚;
设置事务回滚点 可以回滚到指定位置;
- conn.rollback(savePoint);
- conn.commit(); (这句一定要写)
事务的四大特性:
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 事务串行化了 当然没啥问题了~~~