5.1 事务的特性

5.1.1 事务的基本要素

  • 原子性(Atomicity):指事务是一个不可分割的单位,事务中的操作要么都执行,要么都不执行
  • 一致性(Consistency):指事务将数据库从一个一致性状态转换成另一个一致性状态
  • 隔离性(Isolation):指事务在执行过程中不能被其他事务所干扰
  • 持久性(Durability):指事务提交后的数据库变化是永久性的

    5.1.2 事务的隔离级别

  • 脏读:对于两个事务,事务1读取了已经被事务2更新但还未提交的字段,此时事务2回滚,事务1读取的字段则是无效的

  • 不可重复读:对于两个事务,事务1读取了一个字段,事务2更新了该字段,事务1再读取该字段,此时事务1两次读取该字段的值不同
  • 幻读:对于两个事务,事务1读取了一个字段,事务2则插入一些新的数据,事务1再读取该表时,此时事务1两次读取到的内容不同
  • MySQL 的数据隔离级别

    • 读未提交(read uncommitted):允许事务读取未被其他事务提交的变更,会产生脏读、不可重复读、幻读的情况
    • 读已提交(read committed):允许事务读取已经被其他事务提交的变更,避免了脏读的情况,但仍会产生不可重复读、幻读的情况
    • 可重复读(repeatable read)MySQL默认隔离级别,确保事务过程中,其他事务不会修改字段内容,避免了脏读、不可重复读的情况,但仍会产生幻读的情况
    • 串行化(serializable):确保事务过程中,禁止其他事务对表执行插入、修改和删除操作,可以避免三种并发问题,但性能低下

      5.2 事务的创建

      5.2.1 语法

  • 隐式事务:事务没有明显的开启和结束的标记,如 insert、update、delete

  • 显式事务:事务具有明显的开启和结束的标记,需要提前禁用自动提交 ```sql / 事务 /

    1 开启事务

    set autocommit=0; start transaction;

2 sql语句(select/insert/update/delete)

语句1; 语句2;

3 结束事务

3.1 提交事务

commit;

3.2 回滚事务

rollback;

4 事务的隔离级别

4.1 查看

select @@tx_isolation

4.2 修改

设置当前连接的隔离级别

set session transaction isolation level 隔离级别;

设置数据库系统的全局隔离级别

set global transaction isolation level 隔离级别;

5 设置回滚节点

savepoint 节点名; rollback to 节点名;

  1. <a name="PkKDm"></a>
  2. ### 5.2.2 使用
  3. ```sql
  4. # 1 【delete 与 truncate 在事务使用时的区别】
  5. set autocommit=0;
  6. start transaction;
  7. delete from account; # 可以回滚
  8. truncate table account; # 无法回滚
  9. rollback;
  10. # 2 【设置回滚节点】
  11. set autocommit=0;
  12. start transaction;
  13. delete from account where id=0;
  14. savepoint a;
  15. delete from account where id=1;
  16. rollback to a;