找回密码
 立即注册
首页 业界区 业界 数据库事务机制

数据库事务机制

士沌 昨天 22:20
数据库事务机制功能介绍

1.事务功能作用

[code]功能作用:事务功能主要是保证数据库中数据的安全性事务机制:ACID详细ACID参考链接:https://dev.mysql.com/doc/refman/8.4/en/mysql-acid.htmlA: atomicity(原子性)在一个事务中,做的所有语句操作,要么都成功,要么都失败,不能有部分成功部分失败的情况银行转账  账户A  -100-> 账户B账户表中账户名称  账户金额账户A     500账户B     0update 账户表 set 账户金额=账户金额-100 where 账户名称='账户A';   400元update 账户表 set 账户金额=账户金额+100 where 账户名称='账户B';   100元C: consistency (一致性)在一个事务处理数据过程中,数据库正常运行或数据库出现异常重启后,数据信息要保证一致性银行转账  账户A  -100-> 账户B update 账户表 set 账户金额=账户金额-100 where 账户名称='账户A';  update 账户表 set 账户金额=账户金额+100 where 账户名称='账户B';select * from 账户表;账户名称  账户金额账户A     400账户B     100commit;   -- 将内存查看信息保存到磁盘(自动提交/手动提交)重启数据库账户名称  账户金额账户A     500账户B     0doublewrite buffer  -- 双写缓冲区/双写文件中(#ib_16384.dblwr)mysql 存储数据过程中:需要处理的数据都会加载到内存中内存区域         磁盘区域账户A  400                       账户A  500   -- page01账户B  100                       账户B  0page01page01 16kB                      block-01 4kB                                 block-02 4kB                                 数据库进程停止了    page01 - 16KB -- 坏页                                 ..                                 block-04 4kBpage01 16kB   4KB 4KB 4KB 4KB --  doublewrite buffer --  #ib_16384.dblwr (完整内存中16KB数据信息)  page01 - 16KB -- 坏页数据库异常停止,再次重新启动时,会自动触发灾难恢复机制(InnoDB crash recovery)加载磁盘中可能存在坏页:   page01 - 16KB -- 坏页  -- 修复坏页 -- 加载#ib_16384.dblwr 将双页文件中数据修复到坏页中I:Isolation (隔离性)在一个事务中应用隔离特性,主要用于保证事务的操作过程,不会受到其他事务对相同数据操作的影响银行转账  账户A -100-> 账户B   账户A - 500 -> 账户C    事务01  账户A -100-> 账户Bupdate 账户表 set 账户金额=账户金额-100 where 账户名称='账户A';   账户A - 行   Row Lock  -- unLockupdate 账户表 set 账户金额=账户金额+100 where 账户名称='账户B';commit;事务02  账户A - 500 -> 账户Cupdate 账户表 set 账户金额=账户金额-500 where 账户名称='账户A';   账户A - 行   阻塞update 账户表 set 账户金额=账户金额+500 where 账户名称='账户C';-- 可以应用锁机制(写冲突问题)和隔离级别设置(读冲突问题)确保并行事务操作相同数据不会产生冲突D: durability (持久性)事务持久特性,主要是用于保证当数据库内存中没有保存到磁盘的数据释放后,可以有效进行内存数据恢复mysql 存储数据过程中:需要处理的数据都会加载到内存中内存区域         磁盘区域账户A  400                       账户A  500   -- page01账户B  100                       账户B  0page01数据库停止了 (没有做双写操作 没有将数据写入磁盘)内存区域                          磁盘区域账户A  400                       账户A  500   -- page01账户B  100                       账户B  0page01update 记录信息 -- redo文件(记录对数据页中数据的操作信息)                            page01  账户A  500->400 账户B  0->100commit 内存区域                          磁盘区域                                 账户A  500   -- page01                                 账户B  0数据库异常停止,再次重新启动时,会自动触发灾难恢复机制(InnoDB crash recovery)会加载redo文件信息 根据redo文件中数据页信息和磁盘中对应数据页数据对对比redo page01 (LSN信息做对比 01 LSN=200)       磁盘  page01  (LSN信息做对比 01 LSN=100)账户A  500->400  400                          账户A  500账户B  0->100    100                          账户B  0将磁盘中原有数据页重新加载到内存中,并根据redo文件中的操作记录,重新对数据信息进行处理内存区域

相关推荐

您需要登录后才可以回帖 登录 | 立即注册