MYSQL 事务与锁
Mysql 参考手册
https://dev.mysql.com/doc/refman/5.7/en/load-data.html
导读:
什么是数据库事务?
事务并发会带来哪些问题?
事务隔离性与锁的关系?
行锁原理与算法详解?
什么是数据库事务?
事务:
数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;事务是一组不可再分割的操作集合(工作逻辑单元)。
事务场景:
典型事务场景:(转账)
update user_account set balance =balance -100 where user=1;
update user_account set balance =balance +100 where user=1;
哪些引擎支持事务?
MYSAM 不支持事务 innodb 支持事务
事务:数据库默认情况是自动提交事务
例如:update student set sname= '' where id = 1;
手动提交事务的两种方式:
方式一:
begin;
update student set sname= '' where id = 1;
commit;
方式二:
show variables like 'autocommit';
set session autocommit = on //on 自动提交 off 关闭自动提交
update student set sname= '' where id = 1;
commit;
结束事务的两种方式:rollback;commit;
事务的四大特性:ACRD
原子性 :
一致性:
隔离性:
持久性:
事务并发会带来哪些问题?
事务并发的三大问题:
脏读:一个事务读取到其他事务未提交的修改
不可重复读:一个事务读取到其他事务已提交的更新删除
幻读:一个事务读取到其他事务已提交的新增
事务并发的三大问题其实都是数据库读一致性问题,必须有数据库提供一定的事务隔离机制来解决。
事务隔离级别
Mysql可以通过下诉API操作事务隔离级别:
查看系统隔离级别: select @@global.tx_isolation; 查看当前会话隔离级别 select @@tx_isolation; 设置当前会话隔离级别 SET session TRANSACTION ISOLATION LEVEL serializable; 设置全局系统隔离级别 SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
myisam 表锁 innodb 表锁行锁
意向锁相当于flag,不用查询表中是否有行锁。节省时间,提供效率
主键索引是特殊的唯一索引。主键不能未空,唯一可以有一个null