为什么需要事务:
当多线程操作一组数据时,为保持数据一致性,提出了事务的概念
事务的特性:
原子性(atomicity)
事务视为不可分割的最小单位,要么都提交,不可部分提交
一致性(consistency)
数据从一种一致性转化成另一种一致性
持久性(durability)
一旦事务提交,数据永久保存到数据库中,
隔离性(isolation)
未提交
已提交
可重复读
串行化
事务并发问题:
脏读:事务A读了事务B更新后的数据,事务B回滚了;
不可重复度:事务A多次读取同一数据,事务B修改了这些数据,导致事务A多次夺取的值不一样
幻读:事务A修改了一批数据,在这个是时候事务b插入了一条数据,事务A完成后检查数据发线多了一条
其中已提交解决了脏读;
可重复读解决了不可重复读和幻读,通过间隙锁,间隙锁是左开又闭原则,具体看 https://www.jianshu.com/p/32904ee07e56
查看数据库是否支持事务:
show engines;
查看 mysql 当前默认的存储引擎?
show variables like '%storage_engine%';
查看某张表的存储引擎?
show create table 表名 ;
对于表的存储结构的修改?
建立 InnoDB 表:Create table .... type=InnoDB; Alter table table_name type=InnoDB;
事务的语法:
事务回滚 rollback
提交 commit
还原点
savepoint
show variables like '%autocommit%'; 自动提交事务是开启的
set autocommit=0;
insert into testdemo values(5,5,5);
savepoint s1;
insert into testdemo values(6,6,6);
savepoint s2;
insert into testdemo values(7,7,7);
savepoint s3;
select * from testdemo
rollback to savepoint s2
rollback