数据库事务的四大特性以及事务并发访问引起的更新丢失问题
文章来源s默心的编程开发笔记数据库事务的四大特性数据库事务是指作为单个逻辑工作单元执行的一系列操作要么完全的执行要么全部都不执行。和程序事务特性类似数据库事务的四大特性也就是所谓的 ACIDA代表原子性原子性是指事物包含的所有操作要么全部执行要么全部失败回滚C代表的是一致性事务应确保数据库的状态从一个一致状态转变为另外一个一致的状态。一致状态的含义是指数据库中的数据应满足完整性约束以常见的转账为例假设用户 a和用户 b 两者的钱加起来一共是2000那么不管 a和 b之间如何转账转几次账事务结束后两个用户的钱相加起来应该还得是2000这就是事务的一致性。I 代表的隔离性。隔离性是指多个事务并发执行时一个事务的执行不应该影响其他事务的执行。D代表的持久性持久性是指一个事务一旦提交它对数据库的修改应该永久保存在数据库中。持久性意味着当系统或者介质发生故障时确保已提交事务的更新不能丢失即对已提交事务的更新能恢复一旦一个事物被提交DBMS 必须保证提供适当的冗余使其耐得住系统的故障。所以持久性主要在于 DBMS的恢复性能以InnoDB为例它会将所有对页面的修改操作写入一个专门的文件并在数据库启动时从此文件进行恢复操作。这个文件就是我们熟知的 redo log 文件 redo log 文件在这里保证了 InnoDB 的持久性。事务隔离级别以及各级别下的并发访问问题事务并发访问引起的问题以及如何避免Mysql会利用锁机制创建出来不同的事务隔离级别引起的问题更新丢失——MySQL所有事务隔离级别在数据库层面上均可避免更新丢失即一个事物的更新覆盖了另一个事物的更新由于现在主流数据库都会自动为我们加锁来避免这种更新丢失的情况所以我们在这个数据库层面上不好模拟。我们可以模拟一下它出问题的过程如上图所示这里我们假设有两个事务同时对一个账户进行操作它们分别是取款事务和存款事务。它们同时开启事务两个事务都对这个账户进行余额查账的动作发现账户余额为100此时存款事务向账户存入了20块钱那么它的余额就变成了120元。它存入之后就提交了而取款事务并不知道此时存款事务已经提交了它从账户里取出10元并打算将这个余额改为90元。在改成90元的时候它就发现数据错乱了取款事务便遇到异常而回滚了。回滚了之后这个余额就变成了100块钱。这个时候存款事务再去查询发现它之前做的更新操作虽然提示提交成功但是余额并没有变成转账后的余额这就是所谓的更新丢失问题。而更新丢失问题在数据库层面不好模拟的原因就是 mysql innodb各种事务隔离级别在数据库层面上几乎已经避免了这种现象的发生。因此小伙伴们想模拟的话可以借助应用程序访问数据库的场景自己去模拟一下。