mysql_transactionopen in new window
Transation:一组操作的集合,把集合作为整体向系统提交。要么同时成功,要么同时失败
show full processlist;
select * from information_schema. innodb_trx;
SELECT t. trx_mysql_thread_id,
t. trx_state,
t. trx_tables_in_use,
t. trx_tables_locked,
t. trx_query,
t. trx_rows_locked,
t. trx_rows_modified,
t. trx_lock_structs,
t. trx_started,
t. trx_isolation_level,
p. time ,
p. user ,
p. host,
p. db,
p. command
FROM information_schema. innodb_trx t
INNER JOIN information_schema. processlist p
ON t. trx_mysql_thread_id = p. id;
select @@autocommit ;
set @@autocommit = 0 ;
begin ;
start transaction ;
commit ;
rollback ;
原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败《undo_log》 原子性关注状态,要么全部成功,要么全部失败,不存在部分成功的状态 一致性(Consistency):事务完成时,必须使用所有的数据都保持一致状态《A + I + D》 一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见 数据库机制层面:数据会符合你设置的约束(唯一约束,外键约束,Check约束等)和触发器设置 业务层面:保持业务的一致性 隔离性(Isolation):通过隔离机制,保证事务在不受外部并发操作影响的独立环境下运行《锁》 持久性(Durability):事务一旦提交或回滚,它对DB中的数据的更改就是永久的《redo_log》 并发问题 描述 脏读 trx_A读到trx_B没有commit的数据 不可重复读 trx_A先后读取一条记录,结果不同(在trx_A事务里,同一个sql两个结果) 幻读 trx_A没有读到trx_B插入的数据,trx_A插入时却已经存在。好像出现了“幻影”
事务隔离级别越高,数据越安全,但是性能越低 Mysql默认:《repeatable read》 Oracle默认:《read committed》 隔离级别 脏读 不可重复读 幻读 read_uncommitted(读未提交) √ √ √ read_committed(读已提交) √ √ repeatable_read(可重复读) √ serializable(串行化)
隔离级别 原理 read_uncommitted A、B直连DB read_committed DB里数据实时更新到SDB。即:A可以看到B_commit的数据 repeatable_read DB里的数据不会更新到SDB。即:A看不到B_commit的数据。产生幻读,A插入B已经插入的数据失败 serializable A开启,B可以select操作,update,insert操作需要等待A的commit
select @@transaction_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 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 ;
create table mysql_trx (
id varchar ( 36 ) not null primary key ,
name varchar ( 255 ) null ,
age int null ,
upd_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP
) ;
create index idx_age
on mysql_trx ( age) ;
create index idx_name
on mysql_trx ( name) ;
select @@transaction_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 ;
select @@autocommit ;
set autocommit = 0 ;
begin ;
select * from mysql_trx;
insert into mysql_trx ( id, name, age, upd_time)
values ( 'phantom_row' , 'name' , 1 , now ( ) ) ;
commit ;
begin ;
select * from mysql_trx;
insert into mysql_trx ( id) values ( uuid( ) ) ;
insert into mysql_trx ( id, name, age, upd_time)
values ( 'phantom_row' , 'name' , 1 , now ( ) ) ;
commit ;
现在学习的是DB级别的事务,需要掌握的就是事务的隔离级别和产生的数据不一致的情况 后续声明式事务、事务的传播特性、分布式事务