事务就是让数据从一个状态到另一个状态的操作
状态
活动的
事务在执行过程中
部分提交的
事务的最后一个操作已经完成,此时造成的影响只是在内存里,但还没刷写磁盘
失败的
处于活动的或者部分提交的状态时,服务器宕机
中止的
处于失败的事务,我们要rollback,恢复为之前的状态,此时事务中止
假设你开始一个事务,然后你写了一大堆结果发现有一个地方错了,rollback到最开始,我测,那太难受了。这里可以设置savepoint,不用rollback到事务刚开始的状态。用法如下:
提交的
部分提交的数据真正从内存刷新到磁盘了
特性
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚。即要么转账成功,要么转账失败,是不存在中间的状态的。如果无法保证原子性会怎么样?就会出现数据不一致的情形, A账户减去100元,而B账户增加100元操作失败,系统将无故丢失100元。
一致性(Consistency)
执行了一个事务后,数据要从一个合法的状态转移到另一个合法状态。什么是合法?这个是由现实世界的意义映射的
- 举例1: A账户有200元,转账300元出去,此时A账户余额为-100元。你自然就发现了此时数据是不一致的, 为什么呢?因为你定义了一个状态,余额这列必须>= 0。
- 举例2: A账户200元,转账50元给B账户,A账户的钱扣了,但是B账户因为各种意外,余额并没有增加。你也知道此时数据是不一致的,为什么呢?因为你定义了一个状态,要求A+B的总余额必须不变。
- 举例3:在数据表中我们将姓名字段设置为唯一性约束 ,这时当事务进行提交或者事务发生回滚的时候,如果数据表中的姓名不唯一-
,就破坏了事务的一致性要求。
隔离性(Isolation)
事务之间相互不能干扰,也就是说一个事务内部操作的数据不能被其他并发的事务影响。
T1T2是A先后两次给B转账5块钱,下面状态是我们想要的
但现实里很可能是这样的,这银行亏死了A扣了5块但B得到十块
持久性(Durability)
事务一旦提交就不能回撤了,对数据库中数据的影响是永久的。任何故障宕机都不影响。
持久性是通过事务日志来保证的。日志包括了重做日志和回滚日志.当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。