事务 transaction (重要概念)
事务是由一系列对系统中数据进行访问与更新的操作组成的程序执行逻辑单元
事务是用户自定义的数据库操作序列,要么全做,要么全不做,是一个不可分割的工作单位
在关系数据库中,一个事务可以是一条sql语句,一组sql语句或整个程序
事务和程序是两个概念(一般一个程序中包含多个事务)
事务的语法
事务在提交之前都是可以回滚的;
事务开始于
1.连接到数据库上,并执行一条DML语句insert、update或delete
2.前一个事务结束后,又输入了另一条DML语句
事务结束于
1.执行commit(正常操作完提交)或rollback(遇到错误回滚)语句
2.执行一条DDL语句(例如create table语句、grant语句)在这种情况下,会自动执行commit语句
3.断开与数据库的连接
4.执行了一条DML语句,该语句却失败了,在这种情况中,会为这个无效的DML语句执行rollback语句
事务的ACID特性
事务的ACID特性(面试会问)
1、 Atomicity原子性
事务是一个整体,事务中的操作要么全部执行成功,要么全部执行失败
事务执⾏过程中出错, 会回滚到事务开始前的状态,所有的操作就像没有发⽣一样。
2、 Consistency一致性
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态,即在执行一个事务前后数据库的完整性约束没有没有被破坏
数据库都必须处以⼀致性状态,事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前状态
3、 Isolation隔离性
在并发环境中并发的事务互相隔离,一个事务的执行时不被其他的事务干扰,不同的事务访问相同的数据时,每个事务都有各自的完整的数据空间
事务并发会引起脏读、不可重复读、幻读
事务隔离级别有读未提交、不可重复读、可重复读、串行化
4、 Duration持久性
完成事务后,对数据的修改是永久的,即便系统故障也不会丢失
事务并发引起的问题
脏读
读取到了没有提交的数据, 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的 数据是脏数据。
不可重复读
同⼀条命令返回不同的结果集(更新).事务 A 多次读取同一数据,事务 B 在事务A 多次读取的 过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致。 (主要是update引起的数据内容不同)
幻读
重复查询的过程中,数据 就发⽣了量的变化 (主要是insert和delete引起的数量上的变化)
事务隔离级别
查询当前的隔离级别:
select @@transaction_isolation;
设置当前回话的隔离级别为read uncommitted:
set session transaction isolation level read uncommitted;
注意:实际开发过程中,顺序读性能较低,基本不用。
不同的隔离级别的锁的情况(了解)
隐式提交(了解)
隐式提交:执行这种语句句相当于执行commit
DDL 定义语句
数据定义语言,用来定义数据库对象:库、表、列等
DML 操作语句
数据操作语言,用来定义数据库记录(数据)增删改
DCL 控制语句
数据控制语言,用来定义访问权限和安全级别
DQL 查询语句
数据查询语言,用来查询记录(数据)查询
DDL(Data Define Language)语句都是隐式提交