SQL的事务

一、基本概念

  1. 事务是数据库区别于文件系统的重要特性之一,当有了事务 , 就可以让数据库始终保持一致性 , 同时可以通过事务的机制恢复到某个时间点,保证了提交到数据库的修改不会因为系统崩溃而丢失;
  2. 事务只是一个改变 , 是一些操作的集合,用专业术语说,就是一组逻辑操作单元 。事务本身不具备四个特性,而是通过某些手段尽可能让执行单元满足四个特性 , 那么此时称之为一个完整的事务 。
经常在网络上、现实中一提到事务就绑死ACID四个特性,但实际ACID不仅在事务中有体现,还可以涵盖各个领域 。
二、事务处理的原则所有的事务都是作为一组逻辑操作单元来执行 , 即使出现故障 , 都不能改变这种方式 。当在一个事务中执行多个操作时,要么事务提交(commit),所有修改都会永久地保存下来;要么事务回滚(rollback) , 所有修改都放弃,一切回归最初状态 。
常见例子:
A给B转账,A余额减少,B余额增加 , 这是一套必须同时完成的操作 , 如果其中一个失败了,则所有操作都会失败 。
在SQL中体现为:
UPDATE account SET money = money - 100 WHERE name = 'A';UPDATE account SET money = money + 100 WHERE name = 'B';这两句SQL语句就必须同时完成,或同时失败 。
三、ACID
  • 原子性(atomicity):指事务是不可分割的工作单位,要么全部提交,要么全部回滚 。
    原子就是物理世界中最小的单位了,无法在继续分下去了,表达的是一个整体性的概念 。
  • 一致性(consistency):在事务执行前后,数据从一个合法性状态转换到另一个合法性状态 , 这种状态是语义上的,不同的业务场景,对于合法性状态有不同的定义 。
    可以理解为满足预定结果的状态称为合法的状态,这种状态由自己定义,比如现实世界中的约束 。如果满足这种状态,那就是满足一致性 , 如果不满足,这操作失败,事务回滚 。
    比如余额字段设置为无符号数值 , 即钱是不允许负数的,如果此时SQL语句修改余额小于0,此时就不满足定义的语义,所以SQL会执行失败(显示出来就是报错),事务就会回滚 。
  • 隔离性(isolation):
    指事务的执行不能被其它事务干扰 , 即一个事务内部的操作及使用的数据对并发的其它事务都是隔离的、独立的,并发执行的各个事务之间不能互相干扰 。
    比如事务A把余额从0改成100了,此时事务A还没有commit,而事务B进来读取余额了,此时结果是0还是100?这个时候就引出隔离级别这个概念了 。
  • 持久性(durability):
    指事务一旦提交(commit),对数据的改变就是永久性的,之后的其它操作丢不会对其有任何影响 。
    比如A给B转账100,A减去100,B增加100 , 然后事务提交 , A与B的余额就都是修改后的了,如果此时A反悔不转钱了,是无法做到的,只能再开个事务让B给A转回去 。
    持久性是通过事务日志来保证的 , 日志包括重做日志(redo)回滚日志(undo) 。当通过事务对数据进行修改时 , 首先会将数据库的变化信息记录到redo日志中,然后再对数据库对应的行进行修改,这样的话即使数据库崩溃,重启后也能找到没有更新到数据库系统的redo日志重新执行,从而使事务具有持久性
总结:在ACID中,原子性是基?。衾胄允鞘侄危恢滦允窃际跫?nbsp;, 持久性是最终的目的 。
如果要一句话回答事务是什么?那就是保证原子性一致性隔离性持久性的一个或多个数据库操作称为一个事务 。
四、事务的状态