比如A给B转账100 , A减去100 , B增加100 , 然后事务提交 , A与B的余额就都是修改后的了 , 如果此时A反悔不转钱了 , 是无法做到的 , 只能再开个事务让B给A转回去 。总结:在ACID中 , 原子性是基础 , 隔离性是手段 , 一致性是约束条件 , 持久性是最终的目的 。
持久性是通过事务日志
来保证的 , 日志包括重做日志(redo)
、回滚日志(undo)
。当通过事务对数据进行修改时 , 首先会将数据库的变化信息记录到redo日志中 , 然后再对数据库对应的行进行修改 , 这样的话即使数据库崩溃 , 重启后也能找到没有更新到数据库系统的redo日志重新执行 , 从而使事务具有持久性
。
如果要一句话回答事务是什么?那就是保证
原子性
、一致性
、隔离性
, 持久性
的一个或多个数据库操作称为一个事务 。四、事务的状态
- 活动的(active):
事务对应的数据库操作正在执行的过程中 , 称为事务处在活动的
状态 。
- 部分提交的(partially committed):
当事务的最后一个操作
执行完成 , 改动的数据的还处在内存中 , 并没有刷写到磁盘
, 此时称为事务处在部分提交的
状态 。
- 失败的(failed):
当事务处于活动的
或者部分提交的
状态时 , 可能遇到某些错误(数据库自身错误、操作系统错误、断电等)而无法继续执行 , 或人为的停止事务的执行 , 称为事务处于失败的
状态 。
- 中止的(aborted):
如果事务执行了一部分而变为失败的
状态 , 那么就需要将修改过的事务的操作还原(就是回滚操作) , 还原完成后 , 事务就出在了中止的
状态 。
- 提交的(committed):
处于部分提交的
状态的事务将修改过的数据
刷写到磁盘后 , 称为事务处在提交的
状态 。五、事务的隔离级别
隔离级别
的出现 , 就是为了解决ACID中的 I(isolation 隔离性)在并发环境下 , 同时被操作的数据的隔离问题 , 同前面所述例子:比如事务A把余额从0改成100了 , 此时事务A还没有commit , 而事务B进来读取余额了 , 此时结果是0还是100?以MySQL为例 , MySQL是一个
客户端/服务端
架构的软件 , 对于同一个服务器来说 , 可以由若干个客户端与之连接 , 每个客户端与服务端连接上之后 , 称为一个会话(Session) 。每个客户端都可以在自己的会话中向服务器发出请求语句 , 而请求语句可以是某个事务的一部分 。对于服务器来说可以同时处理多个事务 , 但又要满足隔离性
的特性 , 理论上在某个事务对某个数据进行访问
时 , 其它事务应该进行排队
, 直到该事务提交之后 , 其它事务才能继续访问这个数据(类比Java多线程锁机制) , 但这样性能影响太大 。如果既要保持事务的隔离性 , 又想让服务器在处理
经验总结扩展阅读
- 如何打开电脑的屏幕键盘
- 四个字成语和峡有关的
- 我的 Kafka 旅程 - Producer
- Windows esp-idf 安装
- 建议收藏 Java线程同步的四种方式详解
- 历史上武则天和狄仁杰的关系
- 下 MySQL数据库-数据表
- 2023年10月21日是补墙的黄道吉日吗 2023年10月21日补墙好吗
- 乔丹的招牌动作有哪些
- 包贝尔的电影有哪些