随笔 - 33, 文章 - 0, 评论 - 0, 阅读 - 13633

MySQL事务

Posted on   疯狂搬砖人  阅读(64)  评论(0编辑  收藏  举报

1、事务定义
事务:事务是一个最小的不可在分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务是一个最小的工作单元)
一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。
事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。

2.事务是什么?

多个操作同时进行,那么同时成功,那么同时失败。这就是事务。

事务有四个特性:一致性、持久性、原子性、隔离性。

二、事务的四大性质

原子性(Atomicity):事务是一个不可分割的工作单位,要么同时成功,要么同时失败。

  例:当两个人发起转账业务时,如果A转账发起,而B因为一些原因不能成功接受,事务最终将不会提交,则A和B的请求最终不会成功。

持久性(Consistency):一旦事务提交,他对数据库的改变就是永久的。

  注:只要提交了事务,将会对数据库的数据进行永久性刷新。

隔离性(Isolation):多个事务之间相互隔离的,互不干扰

一致性:事务执行接收之后,数据库完整性不被破坏

注意:只有当前三条性质都满足了,才能保证事务的一致性

事务的并发问题

1、脏读(读未提交)

 

 脏读:事务A读取到了事务已经修改但未提交的数据,这种数据就叫脏数据,是不正确的

  

2、读已提交:(不可重复读)

 

 不可重复读:对于事务A多次读取同一个数据时,由于其他是事务也在访问这个数据,进行修改且提交,对于事务A,读取同一个数据时,有可能导致数据不一致,叫不可重复读

 

3、可重复读:(幻读)

 

幻读:原因:因为mysql数据库读取数据时,是将数据放入缓存中,当事务B对数据库进行操作:例如删除所有数据且提交时,事务A同样能访问到数据,这就产生了幻读。
问题:解决了可重复读,但是会产生一种问题,错误的读取数据,对于其他事务添加的数据也将访问不到。

4、串行化

 

串行化:事务A和事务B同时访问时,在事务A修改了数据,而没有提交数据时,此时事务B想增加或修改数据时,只能等待事务A的提交,事务B才能够执行。

问题:用户的体验十分的差,因为每次访问时都要等待其他事务的提交才能操作。

事务的隔离等级

隔离性的隔离级别

1、读未提交 read uncommitted :事物A和事物B,事物A未提交的数据,事物B可以读取到。可以读取到未进行事务提交的修改记录,三种并发问题都没解决。

2、读已提交 read committed :事务A只能读取到事务B提交的数据,这种级别可以避免“脏数据” ,这种隔离级别会导致“不可重复读取” ,Oracle默认隔离级别。

3、可重复读 repeatable read :事务A和事务B,事务A提交之后的数据,事务B读取不到 ,换句话说,对方提交之后的数据,我还是读取不到 - 这种隔离级别可以避免“不可重                复读取”,达到可重复读取 , MySQL默认级别 - 虽然可以达到可重复读取,但是会导致“幻像读”。

4、串行化(序列化) serializable :事务A和事务B,事务A在操作数据库时,事务B只能排队等待 ,这种隔离级别很少使用,吞吐量太低,用户体验差 ,这种级别可以避免”脏读“、 “幻像读”、”可重复读“。

MySQL 事务隔离级别可能产生的问题如下表所示:

隔离级别 脏读 不可重复读 幻读
Read_uncommited
Read_commited ×
Repeatable_read × × √(innodb不会)
Serializable × × ×


 

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示