「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」。
前言
大家好,我是程序猿小白 GW_gw,很高兴能和大家一起学习进步。
以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。
摘要
本文主要介绍Mysql中事务的基本概念,内容略显枯燥,但同样需要我们了解。
事务
1. 事务的介绍
1.1 事务的概念
当我们需要进行多步操作时,例如张三要给李四转账1000万,那首先要从张三的余额中扣除1000万,然后讲李四的余额中加上1000万,万一在扣除了张三的钱之后,服务器挂掉了,这时候李四的余额并没有加上。我相信张三又多了一种死法。
如果我们使用了事务处理就可以避免这种悲剧的发生。
事务处理用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行,一般用来管理insert,uodate,delete语句。
1.2 事务的操作
-
开启事务
start transaction 或者 BEGIN -
回滚事务
rollback 或者 ROLLBACK WORK -
提交事务
commit 或者 COMMIT WORK
【注意】在命令行模式下,mysql的事务是自动提交的(oracle是手动提交的)。可以通过使用显示命令开启事务,或者设置为禁止自动提交。
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交
2. 事务的四大特征
- 原子性:一个事务的所有操作,要么全部执行,要么全部不执行,即整个事务的所有操作看作为一个执行的最小单位。
- 一致性:事务操作前后,数据库的完整性不被破坏,即数据总量不变。
- 隔离性:隔离性防止多个并发执行的事务由于交叉执行而造成数据不一致。
- 持久性:事务处理结束后,无论是否成功(commit或rollback),最终的结果都会永久保存。
3. 事务的隔离级别
3.1 隔离产生的问题
- 脏读:一个事务读取了另一个事务未提交数据。
- 不可重复读:同一个事务前后多次读取,数据内容不一致(别的事务对数据进行了修改)。
- 幻读:前后多次读取,数据总量不一致。(A事务读取了某一个范围内的数据,之后B事务又对这个范围内的数据进行了更改,然后A事务再次读取该范围内的数据时读取到了事务B修改后的数据,好像出现了幻觉一样。)
3.2 隔离级别
- read uncommitted:读未提交
- read committed:读已提交
- repeatable read:可重复读(mysql的默认隔离级别)
- serializable:可串行化
隔离级别从小到大,性能逐渐降低。
| 脏读 | 不可重复读 | 幻读 | |
|---|---|---|---|
| 读未提交 | 可能出现 | 可能出现 | 可能出现 |
| 读已提交 | 不会出现 | 可能出现 | 可能出现 |
| 可重复读 | 不会出现 | 不会出现 | 可能出现 |
| 可串行化 | 不会出现 | 不会出现 | 不会出现 |
数据库查询隔离级别:
SELECT @@transaction_isolation;
数据库设置隔离级别:
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level;
名词解释:
- global:只对执行完该语句之后产生的会话有效。
- session:对当前会话的后续事务有效。
- level取值:
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
- 无关键词:只对下一个即将开启的事务有效,在下一个事务结束后,恢复为默认隔离界别。
小结
以上就是关于Mysql数据库中事务的介绍,希望对读者有所帮助,如有不正之处,欢迎留言指正。