-
事务:
-
事务主要用来处理操作量大、复杂度高、且关联性强的数据。
-
譬如人员管理系统,当删除一个人员时,既要删除人员的基本资料,也要删除和改人员相关的信息,如邮箱、文章等,这些数据库操作语句就构成一个事务。
-
事务处理可以保证数据库的完整性和一致性,成批的sql语句要么全部执行,要么全都不执行,主要针对inssert,update,delete语句而设置。
-
mysql中只有innoDB支持事务。
-
-
事务操作
2.1、开启事务:start transcation
- 任何一条DML语句如insert、update、delete的执行就标志着事务的开启
- 命令:begin或start transcation
2.2、提交事务:commit transcation
- 成功的结束,将所有的DML语句操作历史记录和底层硬盘数据进行一次同步
- 命令:commit
2.3、回滚事务:rollback transcation
- 失败的结束,将所有的DML语句操作历史记录全部清空
- 命令:rollback
2.4、事务的自动提交
-
之前的所有sql操作中也有事务,只是mysql自动完成了,每执行一条sql时mysql就自动提交事务
-
如果需要手动控制事务,需要关闭事务的自动提交
set autocommit = 0 --禁止自动提交 set autocommit = 1 --开启自动提交
2.5、示例
create database if not exists demo_transcation; use demo_transcation; create table account(car_id int primary key,name varchar(8),money double )charset = utf8;insert into account values(1005,'马云','10000'),(1009,'强东',10000);--car_id为1的账号给2的账号转账 set autocommit = 0; --关闭自动提交 select @@autocommit; --查看自动提交状态begin; --开启事务 update account set money = money - 200 where car_id = 1005; update account set money = money + 200 where car_id = 1009; commit; --提交事务 rollback; --如果执行失败时回滚事务
-
事务(transaction)的四大特性(ACID):
3.1 原子性(Atomicity)
- 事务中的所有操作要么全部完成,要么全都不完成,不会结束在中间任何环节中。
- 事务在执行过程中发生错误,会被回滚(rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
3.2 一致性(Consistency)
- 在事务开始之前和事务结束以后,数据库的完整性没有被破坏;即数据库从一个一致性状态转换到另一个一致性状态。
3.3 隔离性(iaolation)
-
并发事务之间相互影响的程度。一个事务所做的修改在最终提交以前,对其他的事务是不可见的,譬如一个事务会不会读取到另一个未提交的事务修改的数据。
-
事务的隔离级别:
– read uncommitted读未提交:最低级别,事务A修改了一个数据但未提交,事务B读到了事务A未提交的更新结果,如事务A提交失败,那B读到的就是脏数据。
– read committed读提交:一个事务要等待另一个事务提交后才能读取数据,可以避免脏读,会造成不可重复读(A事务在提交事务期间读到B事务的数据时不同的)。
– repeateable read可重复读:在开始读取数据时(事务开启时),不再允许修改操作,可避免脏读、不可重复读,但会幻读(A事务在提交前和提交后读到的数据不一致)。
– serializable序列化:是最高的事务隔离级别,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但效率低,比较消耗数据库性能,一般不使用。
– mysql的默认隔离级别为repeateable read
事务隔离级别 脏读 不可重复读 幻读 读未提交read uncommitted yes yes yes 不可重复读read committed no yes yes 可重复读repeateable read no no yes 串行化serializable no no no -
事务隔离级别的操作
--查看事务隔离级别 show variables like '%isolation%';--设置隔离级别 set session transcation isolation level 级别字符串set session transcation isolation level read uncommitted; --设置为读未提交 set session transcation isolation level read committed; --设置为读提交 set session transcation isolation level repeateable read; --设置为可重复读 set session transcation isolation level serializable; --设置为串行化
3.4、持久性(durability)
- 一旦事务提交(Commit),则其所做的修改将永久保存在数据库中。即使系统发生故障,事务的结果也不会丢失。持久性通常依赖于数据库的日志系统,事务的修改操作会被记录在日志中,以便在系统恢复时能够重放这些操作