事务概念
事务(transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操作语言或编程语言书写的用户程序的执行所引起。
事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务基本原理
MySQL允许将事务统一进行管理(存储引擎为innodb),将用户所做的操作,暂时保存起来,不直接放到数据表(更新),等到用户确认结果之后再进行操作
事务在MySQL中通常是自动提交的,但是也可以使用手动事务
自动事务(autocommit)
当客户端发送一条SQL指令(写操作:增删改)给服务器的时候,服务器在执行之后,不用等待用户反馈结果,会自动将结果同步到数据表
一旦自动事务关闭,那么需要用户提供是否同步的命令
commit:提交(同步到数据表,清空事务)
rollback:回滚(清空之前的操作)
通常不会关闭自动事务,这样操作太麻烦,因此只会在需要使用事务处理的时候,才会进行操作(手动事务)
手动事务
手动事务:不管是开始还是过程还是结束都需要用户(程序员),手动的发送事务操作指令来实现
手动事务对应的命令:
1、开启事务:start transaction; //从这条语句开始,后面的所有语句都不会直接写入到数据表(保存在事务日志中)
2、事务处理:多个写指令构成
2、事务提交:commit/rollback; //到这个时候所有的事务才算结束
开启事务:start transaction;
执行事务
将多个连续的但是是一个整体的SQL指令,逐一执行
提交事务
确认提交:comit //数据写到数据表(清空操作日志)
回滚操作:rollback //所有操作无效,清空
回滚点:savepoint
当有一系列的事务操作时,而其中的步骤如果成功了,没有必要重新来过,可以在某个点(成功),设置一个记号(回滚点),然后如果后面有失败,那么可以回到这个记号位置。
1、增加回滚点:savepoint 回滚点名字; //字母、数字和下划线构成
2、回到回滚点:rollback to 回滚点名字; //回滚点之后的所有操作没有了
注意:在一个事务处理中,如果有很多个步骤,那么可以设置多个回滚点。但是如果回到了前面的回滚点,后面的回滚点就失效了。
事务特性
原子性、一致性、隔离性、持久性,这四个通常称为ACID特性
原子性(atomicity):一个事务是一个不可分割的工作单位。事务从start transaction 到 提交事务(commit或者rollback),要么所有操作成功,要么所有操作失败。
一致性(consistency):事务必须是使数据库从一个一致性状态到另一个一致性状态。数据表中的数据修改要么是所有操作一次性修改,要么根本不动
隔离性(isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
如果一个客户端在使用事务操作一个数据(一行或者整表)的时候,另外一个客户端不能对该数据进行操作,如果对该数据进行操作,则发生等待。
什么时候是行被隔离?什么时候是整表被隔离
说明:如果条件中使用了索引,那么系统是根据主键直接找到某记录,这个时候与其他记录无关,那么只隔离一条记录;反之,如果说系统是通过全表检索(每一条都被检查,没有索引),被检索的所有数据都会被锁定(整表)
持久性(durability):也成为永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就是永久性的,接下来的其他操作不会生效。