1.事物
事务:一组原子性的SQL语句
1.1 ACID
A:atomicity,原子性,整个事物中的所有操作要么全部成功执行,要么全部失败后回滚;
B:consistency,一致性,数据库总是从一个一致性状态转换到另外一个一致性状态多个事务并行操作一个数据时,就像串行一样执行,最终并行和串行的执行结果一致
;
若多个事务同时操作一个数据,但不能保证像串行操作数据后的结果的化就像多线程一样不安全了,会带来很多问题,因此事物必须要满足一致性像线程安全
I:isolation,原子性,一个事务所做出的操作在提交之前,是不能为其他所见
如理想状态下完全隔离,完全隔离即只能看到事务提交之前的内容,具体如下图:
因为类似多线程操作一样事物之间会又如下问题
脏读
:读到别人没有commit的数据,因为这个数据有可能会回滚
不可重复读
:在别人没有commit时读age=30,但是又修改age=45,并提交,因此看到被人同一个事物中同一个事物不同的结果
幻读
:事务A发现表中没有tom用户,因此开启事务,添加tom用户,与此同时事务A尚未提交,事务B发现表中也没有tom用户,因此也开启事务添加tom,此时A已经提交完毕,因此事务B添加不成功或者重复添加,但是刚才明显看到没有tom,为什么此时又了呢,这就是幻读。
为解决如上问题,提出4种隔离级别,不同的隔离级别解决了不同的问题
d:durability:持久性:一旦事务提交,其所做的修改会永久保存于数据库中;
1.2 事务流程
- 启动事务
o START TRANSACTION or BEGIN start a new transaction.
o COMMIT commits the current transaction, making its changes permanent.
o ROLLBACK rolls back the current transaction, canceling its changes.
o SET autocommit disables or enables the default autocommit mode for
the current session.
By default, MySQL runs with autocommit mode enabled. This means that as
soon as you execute a statement that updates (modifies) a table, MySQL
stores the update on disk to make it permanent. The change cannot be
rolled back.
- 结束事务
COMMIT
:提交事务,一个事务完成
ROLLBACK
:回滚,即回到之前状态,一般是事务为完成
1.3 测试事务
关闭自动commit
,根据help start transaction的帮助信息可知是自动提交事务,因此需要关闭自动提交事务。- 在终端1上开启事务,查看当前表,并在表中查看入几条内容,同时在另外一个终端2中查看是否插入内容,若没有看到,说明事务已经生效,因此在终端1上commit提交事务,再次回到终端2进行验证。
终端1开启事务,插入数据,但未commit
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
Empty set (0.00 sec)
mysql> insert into user (uname,sex,age) values ('xue','m',30);
Query OK, 1 row affected (0.00 sec)
mysql> insert into user (uname,sex,age) values ('xuh','m',30),('li','f',30);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from user;
+-------+------+------+
| uname | sex | age |
+-------+------+------+
| xue | m | 30 |
| xuh | m | 30 |
| li | f | 30 |
+-------+------+------+
3 rows in set (0.00 sec)
终端2查询数据库,发现表为空
mysql> select * from user;
Empty set (0.00 sec)
终端1提交事务,
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
终端2查看数据库,发现已经数据
mysql> select * from user;
+-------+------+------+
| uname | sex | age |
+-------+------+------+
| xue | m | 30 |
| xuh | m | 30 |
| li | f | 30 |
+-------+------+------+
3 rows in set (0.00 sec)
1.4 事务隔离级别
READ UNCOMMITTED
读未提交
READ COMMITTED
读提交
REPETABLE READ
SERIALIZABLE