事务基本介绍
- 先说一下概念:如果一个包含多个多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
- 操作:
开启事务:start transaction;
回滚:rollback;
提交:commit;
事务提交的两种方式:
1)自动提交:(mysql)一条DML(增删改)语句会自动提交一次事务
2)手动提交:(oracle)需要先开启事务,再提交
修改事务的默认提交方式:
1)查看事务的默认提交方式:SElECT @@autocommit; ----1 代表自动提交 0 代表手动提交
2)修改默认提交方式:set @@autocommit = 0;
事务的四大特征:
1)原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败
2)持久性:当事务提交或回滚后,数据库会持久化的保存数据
3)隔离性:多个事务之间相互独立
4)一致性:事务操作前后,数据总量不变
事务的隔离级别
当然以下情况是在事务并发情况下产生的
1)read uncommitted:读未提交
* 产生的问题:脏读,不可重复读,幻读;
* 例:一个事务修改但没有提交,此时另一个事务进行查询,此时查到的是修改后的,这时第一个事务进行回滚,另一个事务再查,则又恢复原状;顾名思义:读取到了没有提交的事务,随时可能发生改变
2)read committed:读提交(Oracle)
* 产生的问题:不可重复读,幻读;
* 例:这次还是上个例子,可以读取提交后的(不会读取到为提交的修改事务),但是会导致两次查询的结果不一致
3)repeatable read:可重复读(Mysql默认)
* 产生的问题:幻读;
* 例:,B事务进行修改,此时A事务进行查询,但是它不会往下进行,等A事务提交后才可进行查询。问题:如果我只想对一个字段-100,但是此时又有一个事务-100,然后查询不是自己预期的结果
4)serializable:串行化
* 可以解决所有问题
- 隔离级别从小到大安全级别越来越高,但是效率越来越低
- 数据库查询隔离级别:select @@tx_isolation;
- 数据库设置隔离级别:set global transaction isolation leavel 级别字符串;