是什么是事务?
为什么要事务?
用于保证数据的正确性(完整性,一致性)
事务的四大特性(ACID):
原子性(Atomicity):
事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败.
一致性(Consistency)
事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。
比如:如果从A账户转账到B账户,不可能因为A账户扣了钱,而B账户没有加钱
隔离性(Isolation):
事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的
持久性(Duration)
事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态
事务的隔离级别有哪些?
四种(这里的隔离级别从小到大依次为read uncommitted
Serializable
隔离级别下,一个事务对某个表进行查询操作时,会阻塞其它事务对此表的更新操作。
如何查看当前会话使用的事务隔离级别?
select @@tx_isolation;
set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;
set tx_isolation='read-uncommitted';
set tx_isolation='read-committed';
set tx_isolation='repeatable-read';
set tx_isolation='serializable';
set global transaction isolation level read uncommitted;
set global transaction isolation level read committed;
set global transaction isolation level repeatable read;
set global transaction isolation level serializable;
set global tx_isolation='read-uncommitted';
set global tx_isolation='read-committed';
set global tx_isolation='repeatable-read';
set global tx_isolation='serializable';
脏读(一个事务读取了其它事务未提交的数据,然后这个数据后面又北回滚了)
事务隔离级别read-uncommitted
下
A事务对数据修改, 在A事务还没提交时,被修改的数据就可以被事务B读取到。
不可重复读(一个事务对同样查询条件的数据进行多次查询时,得到的结果不一致)
事务隔离级别read-committed
下:
A事务对数据进行修改并提交,B事务分别在A事务提交事务之前、A事务提交事务之后两个时间点读取到的数据不一致。
幻读(一个读取到的数据可能是表中不存在的数据)
repeatable-read
隔离级别下:
A事务对数据进行修改或删除并提交,B事务分别在A事务提交事务之前、A事务提交事务之后两个时间点读取到的数据一致,但事实上数据可能已经被A事务修改或者删除。
可以通过修改事务的隔离级别进行实现,但是要注意隔离级别越高,并发性可能会越差。
事务1 | 事务2 |
---|---|
set tx_isolation=‘read-uncommitted’ | set tx_isolation=‘read-uncommitted’ |
set autocommit=0 | set autocommit=0 |
begin | |
select * from regions; | begin |
… | insert into regions(region_name) values (‘sanjiang’); |
select * from regions; | |
… | rollback; |
事务1 | 事务2 |
---|---|
set tx_isolation=‘read-committed’ | set tx_isolation=‘read-committed’ |
set autocommit=0 | set autocommit=0 |
begin | |
select * from regions; | begin |
… | update regions set region_name=‘shoudu’ where region_id=12; |
… | commit; |
select * from regions; |
事务1 | 事务2 |
---|---|
set tx_isolation=‘repeatable-read’ | set tx_isolation=‘repeatable-read’ |
set autocommit=0 | set autocommit=0 |
begin | |
select count(*) from regions; | begin |
… | delete from regions where region_id=12; |
… | commit; |
select count(*) from regions; |