Mysql事务的定义
事务(transaction)是为保障数据操作可靠而独立执行的逻辑单元。
我们可以把事务理解为一组sql语句的集合,事务可以只包含一条sql语句,也能包含多条复杂的SQL语句,事务中的所有SQL语句被当作一个操作单元,也就是说,事务中的SQL语句要么都执行成功,要么全部执行失败,事务内的SQL语句被当做一个整体,被当做一个原子进行操作。
Mysql事务的特性
事务必须具备以下四个特性,简称ACID特性
原子性Atomicity:事务是不可分割的
一致性 Consistency:事务处理前后数据保持一致
隔离性 Isolation:事务处理必须是独立的彼此隔离
持久性 Durability:事务对数据库的修改被永久保存
Mysql事务提交方式
手动提交事务
自动提交事务
Mysql事务流程
管理事务的语句
开启事务 BEGIN
提交事务 commit
回滚事务 rollback
如何使用手动提交事务
转账过程
#开启事务(指定事务从此处开始)
BEGIN;
#转账:张三的账户少1000元
UPDATE my_account SET money = money-1000 WHERE name=‘张三’;
#李四的账户多1000元
UPDATE my_account SET money=money+1000 WHERE name=‘李四’;
#事务提交(指定事务在此结束)
COMMIT;
注:
事务前后数据总和一致,保证数据一致性
自动提交事务
查看事务状态
show variables like “autocommit”;
关闭自动提交
set autocommit = Off;
或set autocommit = 0;
开启自动提交
set autocommit =On
或set autocommit = 1;
串行化:
同时开启两个事务,当事务1执行的更新语句,此时事务2是查询不了该表的,因为事务1会施加一个写锁,因此事务2对该表的读请求会被阻塞。
读提交:
同时开启两个事务,事务1做的改动,在没提交的情况下,事务2看不到,当事务1提交了,事务2在没提交的情况下,也能看到;
这样就会出现不可重复读以及幻读的问题,比可重复读的问题更多,但是并发性更高!
读未提交:
同时开启两个事务,事务1只要多了数据更新,不管有没有提交,事务2也不关有没有提交,他都能看到更新后的数据!
当前事务能够看到被的事务中没有提交的数据,我们称之为‘脏读’!
当隔离级别处于读未提交的时候,其并发性是最强的,但是隔离性和安全性是最差的!