简单了解mysql 事务
事务:指包含有多个数据库操作指令,这些指令要么都执行要么都撤销;适合多人同时操作一个数据的工况:如银行,机票,保险,证券;
满足事务的四个特性:原子性(所有操作命令是作为一个原子形成整体性都成功或者都失败);
一致性(数据库总量的完整性,即总量不变,理解成能量守恒有失有得,但平衡);
隔离性(事务之间互不影响);
持久性(提交后,影响永久性,);
事务开始和结束:
开始:begin/start transaction; 默认情况下,每个sql语句就是一个事务并主动提交
提交commit;一旦执行了该命令,将不能回滚事务
回滚/撤销:rollback;
注:不提交,在begin下的所有指令不会立马写入到数据库,这个过程中其他窗口查看到的是还是之前的数据;
事务操作非常耗费资源:
1、查询时尽量不用事务;
2、不要出现等待用户输入的情况:占据大量资源;
3、事务要尽可能的简短;
mysql事务自动提交设置
查看自动提交状态:
show variables like “autocommit”;
显示结果一般为on/off;mysql默认为on
重设自动提交状态:
set autocommit = 1/on(开) 或 /0/off(关);
msyql中每一个sql语句的执行本质上就是一个个单独的事务,默认上他是会自动执行完提交的;所谓事务的自动提交 在同一个客户端窗口下是更改了数据也只是在该客户端窗口修改了,但可以rollback; 只要你不提交 在另一个客户端窗口中查看到的底层数据是不会变得;
高并发下的事务的隔离级别
高并发下的问题:
1、脏读/写: 针对未提交事务;B事务去查询或更新事务A更新但还没提交的数据,之后A事务回滚了,导致B事务错读或者错写;
2、不可重复读: 针对update;A事务查询一行数值,A C D事务都在不同时间进行该行数值的修改,那么A事务提交的时间点如果分别在ACD之后,那么它就会获取到不同的数值;
3、幻读: 针对插入和删除;B事务多次执行查询事务,在每次B事务执行的过程中,出现了A C D事务的插入操作,那么B事务获取的结果数目有可能就不同;
第一次B事务可能查到5条数据,第二次B事务可能查询到10条数据,似乎出现了幻影;
隔离机制:
高并发下问题的解决方案;
脏读 不可重复读 幻读 描述
读未提交(Read uncommitted)) 问题存在 问题存在 问题存在 允许一个事务可以读取另一个未提交事务的数据
读已提交(Read committed) × 问题存在 问题存在 一个事务修改的数据必须提交后才能被其他事务读取到
可重复读(Repeatable red) × × 问题存在 在事务结束前,都可以反复读取到事务刚开始时看到的数据
串行化(Serializable) × × × 最高的事务隔离级别,在该级别下,事务串行化顺序执行
注:×号代表解决了上述问题
oracle支持两种隔离级别read committed 和serializable
mysql四种都支持;默认隔离级别:可重复读。
查看全局和当前隔离级别: select @@global.tx_isolation,@@tx_isolation;(系统全局的隔离级别);
修改当前mysql连接隔离级别: set session transaction isolation level serializable;
修改全局的隔离级别: set global transaction isolation level serializable;