MySQL事务

事务的概念及特点

事务:做一件事情,有很多个步骤,这一系列的步骤操作行为就是一个事务。

事务的四大特性:

一致性:要么同时失败 同时成功,如图一例子中不会无端端多500块或少500块,一定是A账户减少500和B账户增加500同时发生,不会是A账户减少500成功而B没有增加500。

隔离性:第一个事务操作时,第二个事务来操作就需要排队,等第一个操作完再操作。两个事务之间互不影响。

 事务的使用:


事务的隔离级别有四种:

脏读不可重复读幻读
读未提交(READ UNCOMMITTED)YYY
读已提交(READ COMMITTED)NYY
可重复读(REPEATABLE READ)NNY
串行(SERIALIZABLE)NNN

1、READ UNCOMMITTED  -  读未提交

读未提交,也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。

该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该隔离级别读取到的数据称之为脏数据,把这个问题称之为脏读。

# 事务T1:启动一个事务
start transaction ;
select * from tx ;
|  id  |  num  |
|  1   |   1   |
|  2   |   2   |

# 事务T2:也启动一个事务(那么两个事务交叉了),在事务T2中执行更新语句,且不提交
start transaction ;
update tx set num = 10 where id = 1 ;
select * from tx ;
|  id  |  num  |
|  1   |   10  |
|  2   |   2   |

# 事务T1:那么这时候事务T1能看到这个更新了的数据吗?
select * from tx ;
|  id  |  num  |
|  1   |   10  |    -----> 可以看到!说明我们读到了事务T2没有提交的数据
|  2   |   2   |

# 事务T2: 事务T2回滚,仍未提交
rollback ;
select * from tx ;
|  id  |  num  |
|  1   |   1   |
|  2   |   2   |

#事务T1:在事务T1里看到的也是T2没提交的数据
select * from tx ;
|  id  |  num  |
|  1   |   1   |   -----> 脏读意味着我们在这个事务中(T1中),事务T2虽然没有提交,但是它任何一条         
                          数据变化我们都能看到
|  2   |   2   |

2 、READ COMMITTED  -  读已提交

读已提交,也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。

由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同SQL查询中,可能会得到不同的结果,这种现象叫做不可重复读。

如:都是select * from user ,  t1事务在t2事务提交前读取的数据  和  t1事务在t2事务提交后读取到的数据不一样 )

# 事务T1:启动一个事务
start transaction ;
select * from tx ;
|  id  |  num  |
|  1   |   1   |
|  2   |   2   |

# 事务T2:也启动一个事务(那么两个事务交叉了),在事务T2中执行更新语句,且不提交
start transaction ;
update tx set num = 10 where id = 1 ;
select * from tx ;
|  id  |  num  |
|  1   |   10  |
|  2   |   2   |

# 事务T1:那么这时候事务T1能看到这个更新了的数据吗?
select * from tx ;
|  id  |  num  |
|  1   |   1   |  --------------> 并不能看到!
|  2   |   2   |                 |
                                 |
# 事务T2: 如果提交了事务T2呢?     |   
commit ;                         |-----> 相同的select语句,在不同时间执行,结果却不一样!
                                 |
#事务T1:                         |
select * from tx ;              | 
|  id  |  num  |                 |
|  1   |   10  |  ---------------> 因为事务T2已经提交了,所以T1中我们看到了数据变化
|  2   |   2   |

3、REPEATABLE READ  -  可重复读

可重复读,是MySQL的默认事务隔离级别,它能确保同一事务多次查询的结果一致。也会有新的问题,比如此级别的事务正在执行时,另一个事务成功插入了某条数据,但是因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。说明在事务中查询不到这条信息,但是自己就是插入不进去,这就叫做幻读。

# users   id 主键

1、T1 : select * from users where id = 1;
2、T2 : insert into users(id,name) values(1,'p1') ;
3、T1 : insert into users(id,name) values(1,'p1') ;

# T1 : 主事务,检测表中是否有id为1的记录,没有的话正常插入,这是我们期望的正常业务逻辑。
# T2 : 干扰事务,目的在干扰T1的正常执行。

在该隔离级别下,1、2是正常执行的,3会报错主键冲突,对于T1的业务来说是执行失败的,这里的T1就发生了幻读,因为T1读取的数据状态并不能支持他的下一步的业务,见鬼了一样。

4、SERIALIZABLE  -  串行

如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL 事务是指一组数据库操作,这些操作要么全部执行,要么全部不执行,其目的是保证在并发环境下,数据的一致性和完整性。MySQL 事务具有 ACID 性质,即原子性、一致性、隔离性和持久性。 MySQL 中使用事务需要使用 BEGIN、COMMIT 和 ROLLBACK 语句,其中 BEGIN 表示开启一个事务,COMMIT 表示提交事务,ROLLBACK 表示回滚事务事务的基本语法如下: ``` BEGIN; -- 执行一组数据库操作 COMMIT; -- 提交事务 -- 或者 ROLLBACK; -- 回滚事务 ``` 在 MySQL 中,事务的隔离级别分为四个等级,分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable。隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。 MySQL 事务的 ACID 性质有以下含义: 1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不会只执行其中的一部分操作。 2. 一致性(Consistency):事务执行前后,数据库中的数据必须保持一致性状态,即满足数据库的约束条件和完整性规则。 3. 隔离性(Isolation):事务之间应该是相互隔离的,一个事务的执行不应该被其他事务干扰,保证事务之间的数据相互独立。 4. 持久性(Durability):事务提交后,对数据库的修改应该是永久性的,即使出现系统故障或电源故障,也不应该对数据产生影响。 总之,MySQL 事务是一组数据库操作,具有 ACID 性质,可以通过 BEGIN、COMMIT 和 ROLLBACK 语句来实现,隔离级别越高,数据的一致性和完整性越高,但同时也会影响数据库的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值