目录
1、事务概念
在MySQL中,事务其实就是一个最小的不可分割的工作单元,事务可以保证一个业务的完整性,也就是说要么全部成功,要么全部失败。
2、事务使用
-
在MySQL中,默认是开启事务的(自动提交)
-
默认开启事务的作用是什么??
当我们去执行一个sql语句的时候,效果会立即体现出来,且不能回滚(rollback)
举个例子:
-
事务回滚(
rollback
):撤销sql语句执行的效果 -
设置mysql自动提交为false
当将设置mysql自动提交为false,我们再进行插入数据,我们发现可以使用回滚(roolback),数据返回到之前的一个状态
但是当我们进行手动提交(commit
)之后,再进行(rollback),数据是不会返回到之前的一个状态
总结:
-
手动开启事务:事务开启之后,一旦commit提交,就不可以回滚(也就是说当前的这个事务在提交的时候就结束了)
1、修改默认提交 set autocommit=0;
2、begin;
3、start transaction; -
事务提交:
commit
; -
事务手动回滚:
rollback
;
3、事务的四大特征(ACID)
3.1 原子性(atomicity)
事务是最小的单位,不可以分割
3.2 一致性(Consistency)
事务要求,同一事务中的 SQL 语句,必须同时成功或者失败
3.3 隔离性(Isolation)
事务a与事务b之间具有隔离性
-
查看数据库的隔离级别
-- 系统级别 select @@global.transaction_isolation; -- 会话级别 select @@transaction_isolation; -- mysql 默认级别 REPEATABLE-READ
3.3.1 read uncommitted(读未提交的);
-
修改隔离级别?
set global transaction isolation level read uncommitted; mysql> set global transaction isolation level read uncommitted; Query OK, 0 rows affected (0.00 sec) mysql> select @@global.transaction_isolation; +--------------------------------+ | @@global.transaction_isolation | +--------------------------------+ | READ-UNCOMMITTED | +--------------------------------+
-
如果有事务a,和事务b,a事务对数据进行操作,在操作的过程中,事务没有被提交,但是b可以看见a的操作的结果
例如转账: 小明(事务a),淘宝(事务b)
这种隔离级别就会产生脏读的问题(可以试着自己操作)– 如果两个不同的地方,都在进行操作,如果事务a开启,他的数据可以被其他事务读取到
– 这样就会出现(脏读)
– 脏读:一个数据读到了另一个事务没有提交的数据,就叫做脏读
3.3.2 read committed(读已提交的);
set global transaction isolation level read committed;
select @@global.transaction_isolation;
mysql> set global transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| READ-COMMITTED |
+--------------------------------+
1 row in set (0.00 sec)
举个例子:
总结:
– 虽然我只能读到另一个事务提交的数据,但还是会出问题,就是读取同一个表中的数据,发现前后不一致 (例如:小张读到数据前后不一致)
– 不可重复的现象
3.3.3 repeatable read(可以重复化);
-
修改隔离级别
set global transaction isolation level repeatable read; select @@global.transaction_isolation;
总结– 这种现象就叫做幻读
– 事务a操作和事务b同时操作一张表,事务a提交的数据,也不能被事务b读到,就会造 成幻读
3.3.4 serializable(串行化);
-
修改隔离级别
set global transaction isolation level serializable; select @@global.transaction_isolation;
总结:– 串行化的问题是,性能特别差
– 串行化的问题是,性能特别差
– 隔离级别越高,性能越差,所以默认的隔离级别是 repeatable read
read uncommitted > read committed > repeatable read > serializable
3.4 持久性(Durability)
事务一旦结束(commit,rollback),就不可以返回