1. 事务的定义

mysql 事务处理操作量大,复杂度高的数据。比如删除一个用户,不但要删除基本资料,还有删除相关评论等,这些数据库操作语句就是事务。

  • mysql 中使用了 Innodb 数据库引擎的数据库或者表才支持事务
  • 事务可以用于维护数据库完整,成批的语句要么全部执行,要么全部不执行
  • 事务管理只用于 insert / update / delete

    2. 事务的特点

    并且事务需要满足四个条件:

  • 原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间的某个状态,如果发生错误就会回滚至开始前的状态,就像事务从来没有执行过一样。

  • 一致性:在事务开始前和事务开始后,数据库的完整性没有被破坏,表示写入的资料完全符合所有表的预设规则。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行是由于交叉执行而导致的数据不一致。事务隔离分为 : 未提交 / 读提交 / 可重复读 / 串行化。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即使系统故障也不会丢失。

    3.事务的操作:

  • begin 开启事务

  • commit 提交事务
  • rollback 回滚 / 撤销正在进行的所有未提交的修改
  • savepoint 允许在事务中创建一个保存点,一个事务中可以有多个保存点
  • release savepoint 删除一个事务的保存点
  • rollback to 把事务回滚到标记点
  • set transaction 设置事务的隔离级别

    4. 事务实例

    1. 使用 begin / rollback

    ```sql mysql> begin; Query OK, 0 rows affected (0.00 sec)

mysql> insert into test2 value(13); Query OK, 1 row affected (0.00 sec)

mysql> insert into test2 value(14); Query OK, 1 row affected (0.00 sec)

mysql> rollback; Query OK, 0 rows affected (0.04 sec)

  1. <a name="Ke4JW"></a>
  2. ## ![image.png](https://cdn.nlark.com/yuque/0/2021/png/190166/1638708454124-746928a2-a3f8-41d2-a0a7-6e9c155e3758.png#clientId=u06c9fb00-95cd-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=284&id=u3ced47cb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=243&originWidth=502&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8455&status=done&style=none&taskId=uddb7021d-a77a-45f5-a946-7b3a9e55264&title=&width=587)
  3. 由于回滚,所以13 / 14 没有插入
  4. <a name="AutC2"></a>
  5. ### 2. 使用 savepoint
  6. 在要回滚的语句前面进行声明
  7. ```sql
  8. mysql> begin ;
  9. Query OK, 0 rows affected (0.00 sec)
  10. mysql> savepoint delete_number;
  11. Query OK, 0 rows affected (0.00 sec)
  12. mysql> delete from test2 where id = 11;
  13. Query OK, 1 row affected (0.04 sec)
  14. mysql> rollback to delete_number;
  15. Query OK, 0 rows affected (0.00 sec)
  16. mysql> commit;
  17. Query OK, 0 rows affected (0.04 sec)

最后发现数据库中依旧存在 11 ,证明没有删除。
image.png

3.查看 commit 是否为自动:

除非使用显示提交 start transaction ,否则都为 auto_commit;
需要自己对是否自动提交进行设置。