文章目录
- MySQL的事务
- 一、事务的基本介绍
- 1、概念:
- 2、操作
- 3、例子:张三给李四转账500元
- 4、MySQL数据库中事务默认自动提交
- 4.1、事务提交的两种方式:
- 4.2、修改事务的默认提交方式:
- 二、事务四大属性(ACID)
- 1、原子性(Atomicity)
- 2、一致性(Consistency)
- 3、隔离性(Isolation)
- 4、持久性(Durability)
- 三、隔离级别
- 1、Read uncommitted (未授权读取、读未提交)
- 2、Read committed(授权读取、读提交)
- 3、Repeatable read(可重复读取)(mysql默认)
- 4、Serializable(序列化)
- 四、乐观锁与悲观锁
MySQL的事务
一、事务的基本介绍
1、概念:
如果一个包含多个步骤的业务操作,被事务管理,要么同时成功,要么同时失败。
2、操作
(1)开启事务:start transaction;
(2)回滚:rollback;
(3)提交:commit;
3、例子:张三给李四转账500元
-- 0.开启事务
start transaction;
--1.张三账户-500
update account set balance =balance-500 where name="zhangsan"
--2.李四账户+500
update account set balance =balance+500 where name="lisi"
--3.出现异常,回滚
rollback;
--4.无异常,提交
commit;
4、MySQL数据库中事务默认自动提交
4.1、事务提交的两种方式:
1.自动提交
oracle默认手动提交
mysql就是自动提交的
一条DML(增删改)语句,会自动提交一次事务。
2.手动提交
先开启事务,再提交
4.2、修改事务的默认提交方式:
1.查看事务的默认提交方式:
select @@autocommit;
1 代表自动提交
0 代表手动提交
2.修改默认提交方式(修改成手动)
set @@autocommit = 0;
二、事务四大属性(ACID)
- 原子性
- 一致性
- 隔离性
- 持久性
1、原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
因此事务的操作,如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
2、一致性(Consistency)
一致性,是指事务必须使数据库从一个一致性状态变换到另一个一致性状态;
也就是说一个事务执行之前和执行之后都必须处于一致性状态。
举例:
假设用户A和用户B两者的钱加起来一 共是1000,那么不管A和B之间如何转账、转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。
3、隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
4、持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
三、隔离级别
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
MySQL的默认隔离级别就是Repeatable read。可重复读
数据库事务的隔离级别有4个,由低到高顺序为:
1、Read uncommitted (未授权读取、读未提交)
如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。
该隔离级别可以通过“排他写锁”实现。
这样就避免了更新丢失,却可能出现脏读。
脏读:也就是说事务B读取到了事务A未提交的数据。
2、Read committed(授权读取、读提交)
读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
该隔离级别避免了脏读,但是却可能会出现不可重复读。
不可重复读:事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
3、Repeatable read(可重复读取)(mysql默认)
可重复读是指在一个事务内,多次读同一数据。
在这个事务还没有结束时,另外一个事务也访问该同一数据。
那么,在第一个事务中的两次读数据之间,即使第二个事务对数据进行修改,第一个事务两次读到的的数据是一样的。
这样就发生了在一个事务内两次读到的数据是一样的,因此称为是可重复读。
读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
这样避免了不可重复读取和脏读,但是有时可能出现幻象读。
(读取数据的事务)这可以通过“共享读锁”和“排他写锁”实现。
4、Serializable(序列化)
提供严格的事务隔离。
它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。
如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
序列化是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。
四、乐观锁与悲观锁
悲观锁,总有人想害朕
乐观锁,天网恢恢,疏而不漏