MySQL--事务

简介

事务其实就是一组相互依赖的操作序列,所有操作都成功,事务才成功,一个行为失败,事务就会失败。

事务特性

  • 原子性(Atomic)
    事物的原子性,就是事务的操作行为是不可分割的工作单元,这些操作要么全部执行,事务成功,要么全都不执行,事务回滚。
  • 一致性 (Consistency)
    事务的一致性是指事务执行之前和执行之后必须处于一致性状态。
  • 隔离性
    隔离性是指一个事务的操作以及用到的数据对其他并发的事务是隔离的,并发执行的各个事务互不干扰。
  • 持久性
    持久性是指如果一个事务被提交了,那么事务对数据库所做的修改是持久的,系统崩溃或者机器故障对它都不会产生影响。

事务的不一致性

事务并发控制的基本单位,如果多个线程都开启事务操作数据库中的相同数据时,如果没有采取隔离性措施,那么可能会造成数据的不一致性。并发操作带来的数据不一致性主要分为四类。
1、丢失更新
多个事务获取同一个数据,并且都基于原始数据进行更新,而每个事务都不知道其他事务的存在,所以最后的更新将会覆盖其他事务的更新操作。
2、脏读
是指一个事务读取到了另一个未提交事务中的数据。
比如事务A修改了一个数据,但是未提交,事务B读取到了事务A未提交的更新结果,如果事务A提交失败,事务B读到的就是脏数据。
3、不可重复读
对于某个数据,一个事务范围内多次查询该数据获得了不同的返回结果。

不可重复读出现的原因是事务并发修改记录

例如事务A读取了用户有100元,之后事务B操作用户存入了100元并提交,事务A再读取用户金额发现读取数据不同。
4、幻读
所谓幻读,指的是当某个事务在读取某个范围内的记录时,令一个事务又在该范围插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。

幻读出现的原因是并发事务增加记录

事务A新增了一条记录,事务B在事务A提交之前和提交之后各进行了一次查询,发现多了一条数据。

MySQL事务的隔离级别

隔离级别 脏读 不可重复读 幻读
读未提交 Y Y Y
读已提交 N Y Y
可重读读 N N Y
串行化 N N N

-Read Uncommited(读取未提交内容)
在未提交读级别,所有的事务都可以看到其他未提交事务的执行结果。
- Read Committed(读取提交的内容)
一个事务只能看到已经提交事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的改变对其他事务都是不可见的。
- Repearable Read(可重复读)
这是MySQL的默认隔离级别,它确保同一个事务多个实例在并发读取数据时,会看到同样的数据行。
- Serializable(可串行化)
这是事务的最高隔离级别,他通过强制事务串行执行,使之不可能相互冲突,从而解决了幻读问题。

死锁

死锁是指两个事务或者多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源,也会产生死锁。
为了解决这种问题,数据库系统实现了各种死锁检测和死锁超时机制。越复杂的系统,比如InnoDB存储引擎,越能检测到死锁的循环依赖,并立即返回一个错误。InnoDB目前处理死锁的方法是,将持有的最少行级排它锁的事务进行回滚。

你可能感兴趣的:(MySQL,事务,锁,数据库)