06 - MySQL事务

1. 事务的4大特性 | ACID

参考1https://www.runoob.com/mysql/mysql-transaction.html

  • 原子性Atomicity:也称不可分割性。一个事务是一个不可分割的工作单位,原子性侧重于状态,事务中包括的操作要么都做,要么都不做,不存在只有部分做了的状态。

  • 一致性Consistency:事务必须是数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的,一致性侧重于可见性,只有最初状态和最终状态的数据对外可见,而中间状态(事务没有结束)的数据对外部不可见。

  • 隔离性Isolation:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据,对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

  • 持久性Durability:也称永久性。一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

注意:1.原子性和一致性的的侧重点不同:原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。而一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见。
2.在未提交读的隔离级别下,会造成脏读,这就是因为一个事务读到了另一个事务操作内部的数据。ACID中是的一致性描述的是一个最理想的事务应该怎样的,是一个强一致性状态,如果要做到这点,需要使用排它锁把事务排成一队,即Serializable的隔离级别,这样性能就大大降低了。现实是骨感的,所以使用隔离性的不同隔离级别来破坏一致性,来获取更好的性能。


2. 自动提交 | autocommit

参考2https://www.bilibili.com/video/BV1Vt411z7wy?p=58

#MySQL默认开启“自动提交”功能,
#即每条SQL语句执行完毕之后都会自动commit,因此接着使用rollback相当于没有效果

#查看autocommit功能的状态(1为开启,0为关闭)
mysql> select @@autocommit;     
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

#手动关闭autocommit功能,就可以随时随地使用rollback。不过这样太随意了,不推荐
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)
#


3. 手动开启事务transaction

#写法1
mysql> begin;
Query OK, 0 rows affected (0.28 sec)

#写法2
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)


4. 事务的隔离级别

  • 查看隔离级别(MySQL默认隔离级别——可重复读)
#会话范围的,每一次数据库连接都是一次会话,如一次jdbc连接
mysql> select @@session.transaction_isolation;
+---------------------------------+
| @@session.transaction_isolation |
+---------------------------------+
| REPEATABLE-READ                 |
+---------------------------------+
1 row in set (0.23 sec)

#全局、系统范围的
mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| REPEATABLE-READ                |
+--------------------------------+
1 row in set (0.28 sec)
  • 修改隔离级别
#会话范围的
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.21 sec)

#全局、系统范围的
mysql> set global transaction isolation level read uncommitted;
Query OK, 0 rows affected (0.28 sec)

#注意:在修改隔离级别时若不指定 GLOBAL/SESSION 关键字,
#则只会针对当前会话中的下一个事务生效,
#当下一个事务结束后,又会恢复到当前会话session设定的隔离级别。

注:上述内容,部分来自于网络或书籍,仅作为学习记录使用。由于参考来源众多,未依次标明出处。若有原作者看到此文,麻烦联系本人,我会第一时间处理。我对由此给您带来的不便,深感抱歉!望见谅,谢谢!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容