事务:一个或者一组sql
语句组成一个执行单元,这个单元要么全部执行,要么全部不执行
事务的(ACID)属性:
原子性(Atomicity )
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性( Consistency )
事务必须使数据库从一个一致性状态变换到另外一个一致性状态.
隔离性( Isolation)
事务的隔离性是指- -个事务的执行不能被其他事务干扰,即一-个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability)
持久性是指-一个事务一-旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
创建事务:
#显式事务:事务具有明显的开启和结束的标记
#前提:必须先设置自动提交功能为禁用
set autocommit=0;
#步骤1:开启事务
set autocommit=0;
start transaction; 可选的
#步骤2:编写事务中的sql语句(select insert update delete)
语句1;
语句2;
#结束事务
commit(提交)/ rollback(回滚)
savepoint (设置保存点) 搭配 rollback to使用
事务的隔离级别:
1. Read UnCommitted(读未提交)
最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。
2. Read Committed(读提交)
大部分数据库采用的默认隔离级别。一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。
3. Repeatable Read(重复读)
mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。
4. Serializable(序列化)
最高隔离级别。所有事务操作依次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它。
5.脏读
脏读发生在一个事务A读取了被另一个事务B修改,但是还未提交的数据。假如B回退,则事务A读取的是无效的数据。这跟不可重复读类似,但是第二个事务不需要执行提交。
6.不可重复读
事务2提交成功,它所做的修改已经可见。然而,事务1已经读取了一个其它的值。在序列化和可重复读的隔离级别中,数据库管理系统会返回旧值,即在被事务2修改之前的值。在提交读和未提交读隔离级别下,可能会返回被更新的值,这就是“不可重复读”。
有两个策略可以防止这个问题的发生:
(1) 推迟事务2的执行,直至事务1提交或者回退。这种策略在使用锁时应用。
(2) 而在多版本并行控制中,事务2可以被先提交。而事务1,继续执行在旧版本的数据上。当事务1终于尝试提交时,数据库会检验它的结果是否和事务1、事务2顺序执行时一样。如果是,则事务1提交成功。如果不是,事务1会被回退。
7.幻读
幻读发生在当两个完全相同的查询执行时,第二次查询所返回的结果集跟第一个查询不相同
发生的情况:没有范围锁。
脏读 不可重复度 幻读
read uncommitted 可 可 可
read committed 不可 可 可
repeatable read: 不可 不可 可
serializable: 不可 不可 不可
select @@tx_isolation; # 查看隔离级别
set session| global transaction isolation level #设置隔离级别