了解什么是数据库的事务
事务就是数据库管理系统(DBMS)执行过程中的一个逻辑单位(不可在进行分割),由一个有限的数据库操作序列构成(多个DML语句,select语句不包括事务),只要是对数据库进行一系列的数据更替操作,都是事务。
注意:mysql数据库中在创建一个数据库时,默认的是innodb数据库引擎,目前接触到的数据库引擎只有使用这个引擎的数据库和表才支持事务。
事务ACID
原子性(Atomicity,或称不可分割性)理解:最常用的例子就是转账,要么同时发生,要么同时不发生。
隔离性(Isolation,又称独立性)理解:两个人同时给一个账户转账,互不干扰。在并发中会有很多问题,后面介绍
持久性(Durability)理解:不论怎么刷新你的账户金额,都不会改变。
一致性(Consistency)理解:转账的金额要符合逻辑运算。
事务并发会带来哪些问题?
1,脏读(读未提交的数据):在两个并发事务中,开启事务1,查询数据得到的是1,开启事务2,在事务2中修改数据为2并未提交,事务1再查询,得到的数据为2,读到了别人未提交的数据,当面临庞大并发量时,问题会很严重。
2,不可重复读(读取了已提交的数据): 同上面的例子,在事务2修改或者删除(update/delete)了数据,并且提交了,然后事务1查询到数据2,违反了隔离性的要求,事务互不干扰。
3,幻读:同不可重复读例子一样,这时事务2不是修改删除,而是添加(insert into)
发现了问题,如何解决?
事务隔离级别
1,未提交读(read uncommitted)上面的问题都解决不了,大白给。
2,已提交读(read committed)解决了脏读。
3,可重复读(repeatableread)解决了脏读,不可重复读。(常用)
4,串行化(serializable)什么都解决了,不让你并发就没问题了呀。
MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令set autocommit = 0 用来禁止使用当前会话的自动提交。
begin;##事务开始
update vip set vname='god' where vid=3;##eg
insert into manager(muser,mpassword) values ('qwe','123456');##eg
select * from manager;##eg
COMMIT;##事务提交
ROLLBACK;##回滚
show variables like 'autocommit';##查看自动提交状态
set autocommit = 1;//默认为1,显示on
set autocommit = 0 ;//关闭,显示为off