事务简介
1、 图中所示存储过程存在一个问题:通过OUT参数返回的更新行数可能与实际受影响的行数不一致。该过程包含两个步骤:先执行SELECT语句统计待更新的行数,再执行UPDATE操作。由于这两个操作并非原子执行,若在统计之后、更新之前有其他客户端修改了相关数据,就会导致计数偏差。例如,当某一客户端运行年度调薪程序时,另一客户端恰好更新了同一范围内的工资记录,那么前者统计的行数将不再准确,最终返回的更新数量便会与实际情况不符。
2、 采用事务性处理可有效避免此类竞争条件。
3、 所有领域的事务处理,无论是否涉及数据库,都必须满足ACID四个基本属性。
4、 事务具有原子性,意味着其操作要么全部完成,要么完全不执行,数据库不会处于仅部分事务生效的中间状态。
5、 事务执行完毕后,数据库状态需符合所有预设规则。例如,双方转账时,一方扣款金额必须与另一方入账金额完全相等,确保数据逻辑一致。
6、 并行执行的事务应彼此隔离,如同在数据库中单独运行一般。
7、 事务一旦提交,其结果将永久保存,不受后续操作或系统故障影响。
8、 要让第一步图中的存储过程具备事务性,需通过START TRANSACTION开启事务,并在操作完成后用COMMIT提交,确保数据一致性,具体流程所示。
9、 )
10、 END
11、 执行该事务期间,其他所有尝试修改工资表的连接将被阻塞,直至事务结束。
12、 当执行存储过程时,若检测到数据库状态不一致或未满足特定条件,可主动终止事务,通过执行 ROLLBACK 语句回滚操作,确保数据完整性与一致性。
13、 回滚操作一般通过数据库日志来实现,日志记录会从事务起始点开始逆向撤销。若其他事务依赖于被回滚事务的数据,则这些相关事务也将随之一同回滚,以确保数据一致性。
评论
更多评论