事务

事务执行期间 抛出异常 系统自动回滚;

设置事务回滚点 可以回滚到指定位置;

  •   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 事务串行化了 当然没啥问题了~~~

你可能感兴趣的:(事务)