事务管理
事务是由N步数据库操作序列组成的逻辑执行单元,组成这组操作的各个单元要么全部成功,要么全部失败。即一组sql语句中哪怕有一条失败也会失败
举个例子:转账操作,一个账户减少钱,一个账户增加钱
默认情况下,MySQL的事务是自动提交的,也就是执行了增删改查操作之后,数据直接持久化到磁盘上,不能撤销
但是如果改为手动事务之后,更新过的数据,在没有使用commit提交时,可以通过rollback进行撤回
数据库事务的原理
start transaction / begin:开始事务
rollback:回滚事务
commit:提交事务
什么是数据库事务?
从开启到提交为一个事务
一个事务对应一组业务,一个事务中间可以有一条sql语句或者多条sql语句
当一个业务开始之前开启事务,当一个业务结束之后提交事务
例如刚刚转账案例:我们的需求是让一个账户减少钱的同时让另一个账户增加钱——可以写成一个事务
事务的特征:
原子性:
事务开始后,所有的操作要么全部做完,要么全部不做,不可能滞留在中间环节。
事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。
一致性:
事务开始前和结束后,数据库的数据完整性约束没有被破坏,事务前后操作数据是一致的,可以理解为能量守恒
例如:A向B转账,不可能A扣了钱,B却没有收到
隔离性:
一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
例如:A正在从一张银行卡取钱,在A取钱的过程结束前,B不能向这张卡转账
注意:
两个事务之间是有隔离级别的,隔离级别的不同会导致出现不同的问题。
脏读 幻读 不可重复读
持久性:
指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,并不会被回滚。接下来的其他操作或故障就不应该对其有影响。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。