1. 事务的4大特性 | ACID
参考1:https://www.runoob.com/mysql/mysql-transaction.html
原子性
Atomicity:也称不可分割性。一个事务是一个不可分割的工作单位,原子性侧重于状态,事务中包括的操作要么都做,要么都不做,不存在只有部分做了的状态。一致性
Consistency:事务必须是数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的,一致性侧重于可见性,只有最初状态和最终状态的数据对外可见,而中间状态(事务没有结束)的数据对外部不可见。隔离性
Isolation:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据,对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。持久性
Durability:也称永久性。一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
注意:1.原子性和一致性的的侧重点不同:原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态。而一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见。
2.在未提交读的隔离级别下,会造成脏读,这就是因为一个事务读到了另一个事务操作内部的数据。ACID中是的一致性描述的是一个最理想的事务应该怎样的,是一个强一致性状态,如果要做到这点,需要使用排它锁把事务排成一队,即Serializable的隔离级别,这样性能就大大降低了。现实是骨感的,所以使用隔离性的不同隔离级别来破坏一致性,来获取更好的性能。
2. 自动提交 | autocommit
参考2:https://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设定的隔离级别。
- 4种隔离级别及相应的并发操作问题
参考4:https://www.cnblogs.com/myseries/p/10748912.html
注:上述内容,部分来自于网络或书籍,仅作为学习记录使用。由于参考来源众多,未依次标明出处。若有原作者看到此文,麻烦联系本人,我会第一时间处理。我对由此给您带来的不便,深感抱歉!望见谅,谢谢!