1事务概述
>>一个事务其实就是一个完整的业务逻辑。
是一个最小的工作单元。不可再分。
假设转账,从A账户向B账户中转账10000.
将A账户的钱减去10000(update语句)
将B账户的钱加上10000(update语句)
这就是一个完整的业务逻辑。
>>说到底,说到本质上,一个事务其实就是多条DML语句同时成功,或者同时失败!(保证数据符合实际,保证数据安全)
2在mysql中
提交事务 commit;
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。
提交事务标志着,事务的结束。并且是一种全部成功的结束。
回滚事务 rollback;
将之前所有的DML操作全部撤销,并且清空事务性活动的日志文件
回滚事务标志着,事务的结束。并且是一种全部失败的结束。
如果不使用 start transaction ,都是每条DML语句就提交一次。
示例:
1. mysql> select * from dept_bak;
Empty set (0.00 sec)
2. start transaction;
3. insert into dept_bak values(10,'abc', 'tj');
4. insert into dept_bak values(10,'abc', 'tj');
5. select * from dept_bak; //注意,在transaction进行中,前面语句的执行效果是可以被查询到的!!
+--------+-------+------+
| DEPTNO | DNAME | LOC |
+--------+-------+------+
| 10 | abc | tj |
| 10 | abc | tj |
+--------+-------+------+
6. rollback;
7. select * from dept_bak;
Empty set (0.00 sec)
3事务特性
A:原子性
说明事务是最小的工作单元。不可再分。
C:一致性
所有事务要求,在同一个事务当中,所有操作必须同时成功,或者同时失败,
以保证数据的一致性。
I:隔离性
A事务和B事务之间具有一定的隔离。
教室A和教室B之间有一道墙,这道墙就是隔离性。
A事务在操作一张表的时候,另一个事务B也操作这张表会那样???
D:持久性
事务最终结束的一个保障。事务提交,就相当于将没有保存到硬盘上的数据
保存到硬盘上!
4事务隔离种类
①读未提交: read uncommitted(最低的隔离级别)(可以理解为没有隔离)
>>事务A可以读取到事务B未提交的数据
>>缺点:脏读现象 (Dirty Read)
>>实例:事务A,B开启——t表空——事务A插入数据1——事务B可以查到数据1
②读已提交: read committed
>>事务A只能读取到事务B提交之后的数据
>>缺点:不可重复读取数据 (每次select读到的数据会不一样)
>>实例:t表有数据1——事务A,B开启——事务A插入数据2——事务B可以查到数据1,但查不到数据2——事务A提交——事务B可以查到数据1和数据2
③可重复读:repeatable read
>>事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的。
>>缺点:幻影读 (虽然每次读到的都是一样的,但是实际上有的数据已经发生改变了)
>>实例:相当于事务A开启的那一刻,就对数据拍了一个快照,之后就算事务B提交数据,也不会影响事务A的查询的数据。
④序列化/串行化:serializable(最高的隔离级别)
>>事务排队,不能并发!
>>每一次读取到的数据都是最真实的,并且效率是最低的。
5事务隔离查询修改
5.1查询:
select @@global.transaction_isolation; (全局)
select @@session.transaction_isolation; (会话)
如果选择global,意思是此语句将应用于之后的所有session,而当前已经存在的session不受影响。
如果选择session,意思是此语句将应用于当前session内之后的所有事务。
如果什么都不写,意思是此语句将应用于当前session内的下一个还未开始的事务。
5.2修改:
set global transaction isolation level read uncommitted;