MySQL学习·第五站~
本文已收录至专栏:MySQL通关路
❤️文末附全文思维导图,感谢各位点赞收藏支持~
事务,指的是一组操作的集合,它是一个不可分割的工作单位,它会把这个集合中所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
事务常常用于在需要操作多条记录或多张表的情况下,为了避免在执行过程中出现异常行为导致数据一致性被破坏,这时候我们就需要开启事务。
就比如最经典的银行转账问题:
假设我们没有开启事务,也就是这一系列操作不在一个事务的范围内:
值得一提的是,默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。即默认情况下,一条SQL语句就是一个事务。假如关闭自动提交则必须在每次执行SQL之后手动提交事务,否则SQL不生效。
SELECT @@autocommit;
其中 1
表示自动提交事务,0
表示手动提交事务。
SET @@autocommit = 0; # 设置为手动提交事务
SET @@autocommit = 1; # 设置为自动提交事务
COMMIT;
我们关闭了自动提交事务,执行SQL后发现执行成功,但没有提交事务,查看数据库发现数据并未发生变化。
待我们提交事务后,数据才更新!
ROLLBACK;
rollback
使得事务回滚,即恢复事务开始执行之前的状态。START TRANSACTION; 或 BEGIN;
START TRANSACTION; 或 BEGIN;
然后执行SQL,最后commit的方式控制事务。事务有着四大特性(ACID
):
一致性(C
onsistency):事务完成时,必须使所有的数据都保持一致状态。
隔离性(I
solation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立 环境下运行。
D
urability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。多个事务同时操作某一个数据库或者某一张表时,可能会产生一系列问题:
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影”。
为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别。主要有以下几种:
隔离级别(发生- √,不发生- ×) | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted (读未提交) |
√ | √ | √ |
Read committed (读已提交) |
× | √ | √ |
Repeatable Read (可重复读)(默认) |
× | × | √ |
Serializable (串行化) |
× | × | × |
MySQL默认的隔离级别为Repeatable Read
,也就是只会产生幻读问题。当然,随着安全系数的增加,数据库的性能也有所下降。
SELECT @@TRANSACTION_ISOLATION;
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }