事务
1.概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
2.操作: 1. 开启事务: start transaction; 2. 回滚:rollback; 3. 提交:commit;
3.MySQL数据库中事务默认自动提交
自动提交: mysql就是自动提交的,一条DML(增删改)语句会自动提交一次事务。 手动提交:Oracle 数据库默认是手动提交事务,需要先开启事务,再提交
修改事务的默认提交方式: * 查看事务的默认提交方式:SELECT @@autocommit; 1 代表自动提交 0 代表手动提交 * 修改默认提交方式: set @@autocommit = 0; 举例:(用来做测试的表
SELECT @@autocommit;
set @@autocommit = 0;
START TRANSACTION
UPDATE account set balance = balance - 500 where name ='zhangsan';
UPDATE account set balance = balance + 500 where name ='lisi'
此时没有提交事务,在新建一个查询里面查询表里面的数据,得到: 当使用commit提交事务后,再查询就能得到修改后的数据,也就是我们预期的数据。 如果有错误,通过rollback事务回滚到开启事务之前的状态,可以有效避免对数据库的失误操作。
注意:InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在start transaction和commit之间,组成一个事务;
事务四大特征:
- 原子性::一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样
- 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
1.原子性由undo log日志来保证,因为undo log记载着数据修改前的信息。 2.持久性由redo log 日志来保证,当我们要修改数据时,MySQL是先把这条记录所在的「页」找到,然后把该页加载到内存中,将对应记录进行修改。 3. 一致性是事务的目的。而原子性,隔离性,持久性都是为了保障 【一致性】 的手段,一致性由应用程序来保证
事务的隔离级别
概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
存在问题:
- 脏读:一个事务,读取到另一个事务中没有提交的数据(如果使用了rollback,则另外一个事务读取到的就是一个假数据)
- 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样(白话:我刚刚才读取到这个数据为A,转眼你就把这个数据修改为B,下次你还可能把它修改为C)。
- 幻读:一个事务操作(DML)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改。
隔离级别:
- read uncommitted:读未提交
* 产生的问题:脏读、不可重复读、幻读 - read committed:读已提交 (Oracle)
* 产生的问题:不可重复读、幻读 - repeatable read:可重复读 (MySQL默认)
* 产生的问题:幻读 - serializable:串行化(相当于不允许事务的并发)
* 可以解决所有的问题
注意:隔离级别从小到大安全性越来越高,但是效率越来越低 补充:隔离级别是通过MVCC机制,给读,写操作加上锁,来解决对应问题
|