事务基本介绍

  1. 先说一下概念:如果一个包含多个多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。
  2. 操作:
    开启事务: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 级别字符串;