MySQL事务
MySQL事务
事务用于保证数据的一致性,由一组相关的dml语句组成,该组的dml语句要么全部成功后提交,要么全部失败。进行一个事物操作时,也可以防止其它用户修改表的数据。
举个例子:转账这个操作需要在数据库中先给转载方扣去一定金额,再给收款方增加一定金额,这两个操作是关联的,它们必须都成功,否则转账就出现了问题。
事务的基本操作
开始一个事务
注意:表的存储引擎为InnoDB才可以使用事务操作。
START TRANSACTION;
设置保存点
语法:SAVEPOINT 保存点名称
SAVEPOINT point_a;
回退事务
选择回退到保存点:ROLLBACK TO 保存点
回退到事务开始转台:ROLLBACK
ROLLBACK TO pointa;
提交事务
一旦提交事务后,所有的操作将生效,其它在使用数据库的人将会看到你操作后表的结果,提交后不可以进行回退。
-- 提交 --
commit
事务隔离
当存在多个连接开启事务操作数据库时,数据库系统需要设置隔离级别以保证各个连接在获取数据时的准确性.如果没有设置事务隔离,将可能引发脏读,不可重复读,幻读等问题
- 脏读:当一个事务读取另一个事务还没有提交的的操作
- 不可重复读:同一个查询在一次事务中执行多次,因为其它事务提交的修改,删除操作导致返回的结果集不完全一致。
- 幻读:同一个查询在一次事务中执行多次,因为其它事务提交的插入操作导致返回的结果集不完全一致。
事务隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
读未提交(READ UNCOMMITTED) | 允许 | 允许 | 允许 | 不加锁 |
读已提交(READ COMMITTED) | 禁止 | 允许 | 允许 | 不加锁 |
可重复读(REPEATABLE READ) | 禁止 | 禁止 | 禁止 | 不加锁 |
可串行读(SERIALIZABLE) | 禁止 | 禁止 | 禁止 | 加锁 |
加锁读后,必须等待其它事务提交后才进行读取。
查看和设置事务隔离级别
查看隔离级别(MySQL8.0): SELECT @@TRANSACTION_ISOLATION
查看隔离级别(MySQL5.7): SELECT @@tx_ISOLATION
设置隔离级别:SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别
-- 设置读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
说明:系统默认的隔离级别是可重复读,一般情况下不用修改隔离级别
事务ACID特性
原子性:事务是不可分割的一个单位,一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
持久性:事务处理结束后,对数据的修改就是永久的,
学习总结来源于韩顺平老师一周学会MYSQL