事务
概念:一个或一组SQL语句组成的执行单元,执行单元所有SQL语句要么全执行,要么全不执行。
栗子:张三给李四转账。
张三:账户1000元。 李四:账户1000元。
update 表 set '张三账户' = 500 where name = '张三';
数据库中途异常...
update 表 set '李四账户' = 1500 where name = '李四';
(两条语句组成一个执行单元,中途如果出现意外,结果显然不是想要的。)
每条语句相互依赖,作为一个不可分割的整体,如果发生意外回滚至最初状态。
事务的特点:
①.原子性:事务是不可分割的一个单位,事务中操作要么都执行,要么都不执行。
②.一致性:事务必须从一个一致性状态到另一个一致性状态。
(转账栗子中转账前是2000元,转账后依然是2000元。)
③.隔离性:一个事务执行不被另一个事务干扰。(隔离级别控制)
④.持久性:一个事务一旦被提交,对数据库数据是永久性的。
(删除操作,无法恢复,只能重新创建。)
事务的创建和分类:
①.隐式事务:事务没有明显开启结束标记。
(如:insert、update、delete语句。autocommit自动提交默认开启状态。)
②.显式事务:事务具有明显开启结束标记。
(设置自动提交为off ,只对当前事务有效)。
栗子:
⒈设置自动提交状态。
set autocommit = 0;
⒉编写需要的SQL语句。
(select、delete、update、insert)
⒊结束事务。
commit;(提交事务) 或 rollback;(回滚事务)
隔离
事务并发:
同时运行的多个事务,当这些事务访问数据库相同数据时,
如果没有采用隔离机制,就会出现并发问题。
出现的问题:
①.脏读:事务1对数据库数据进行更新,但没有提交,
事务2读取相同数据,此时如果事务1回滚事务2读取的数据就是临时且无效的数据。
②.不可重复读:事务1读取数据库数据之后,没有提交,
此时事务2对相同数据进行更新,事务1再次读取数据时数据变了。
③.幻读:事务1读取数据库数据之后,没有提交,
此时事务2插入新的数据,事务1再次读取数据时多出一些数据。
事务的隔离级别:
①.read uncommitted :脏读,不可重复读,幻读都会出现。
②.read committed :避免脏读,会出现不可重复读和幻读。
③.repeatable read :避免脏读和不可重复读,会出现幻读。
④.serializable :都会避免。
命令:
⒈查看隔离级别:
select tx_@@isolation;
⒉设置隔离级别:
set session/global transaction isolation level 隔离级别;
MySQL默认第三种隔离级别,Oracle默认第二种。