1.简单概念
事务是一个不可分割的最小的工作单元,事务能够保证业务正确进行。
mysql中默认开启事务(查看方式:select @@autocommit)
默认开启事务:执行一条命令语句时,效果会立即体现出来,且无法回滚(rollback),下面介绍两种可以使用撤销的方法。
- 取消默认开启事务(永久性):set autocommit=0; 执行指令后数据并没有提交,只是生成了一个临时表,需要手动提交(commit)才能生效。
2.通过手动开启事务的方式使rollback生效(一次性)。
首先输入begin 或者 start transaction,然后再执行命令语句,此时可以用rollback回滚到事务开始之前的状态。
2. 四大特征ACID
A 原子性:事务是最小的单位,不可以分割;
C 一致性:事务要求,同一事务的sql语句,必须保证同时成功或者同时失败
I 隔离性:事务1和事务2之间要有隔离性
D 持久性:事务一旦结束(commit),就不可以返回(rollback)
3. 事物的隔离性
①read uncommitted 读还未提交 ——【脏读】
多个事务操作数据,在某个事务还没提交时(此时可以rollback),其他事务就可以看见该事务操作的结果
②read committed 读已经提交的 ——【不可重复读】
事务A在读数据表时,中间过程有其他事务对该表进行了修改,再次查询发现表的内容发生变化,这意味着每次读数据可能都不一样。
③repeatable read 可以重复读 ——【幻读】
事务A和事务B同时操作一张表,事务A提交的数据,也不能被事务B读取到,但是事务B操作时数据表的内容实际上可能已经被A修改过,如果两个事务执行的操作互斥(如插入含有相同的unique字段的记录)将会报错。
④serializable 串行读
当数据表被事务A操作时(开启事务但是还没commit),事务B的写入操作将被阻塞,事务A一旦commit,事务B的操作将马上执行(不可以超时)
事务的隔离级别越高,问题越少,性能越差!!!
查询数据库的隔离级别 select @@ global.transaction_isolation;
修改数据库的隔离级别 set global transaction isolation level 隔离级别
MySQL默认的隔离级别为repeatable read