事务由一组sql语句组成
事务的sql语句整体成功,整体失败
A:100 B:0-> A:0 B:100
-- A转账B
update 账户 set money=money-100
where id='A';
update 账户 set money=money+100
where id='B';
-- 转账要么同时成功,要么同时失败(只要有一个失败就)回到转账执行之前的状态
数据操作的最小单元是事务,而不是sql语句
事务的操作
不启动事务是单条的sql语句的成功与失败(某条sql语句失败,前面的操作不恢复)
启动事务后,执行sql语句,中间某条sql语句失败,它前面的操作还可恢复,这种恢复以前的状态叫回滚,回滚到事务之前。
启动事务
begin
或
start transaction
事务启动后,执行的增删改操作,会暂时记录在一个日志文件中(临时记录)。
提交事务
commit
提交事务后,事务日志中的记录数据操作在数据表中生效,并清空日志文件。
回滚事务
rollback
直接清空日志
事务的特性
A——原子性Atomic
数据操作的最小单元是事务,而不是sql语句
C——致性Consistency
一致性,事务完成前后,数据要保持逻辑的一致性
A+B=100转账前
A+B=100转账后
I——隔离性Isolation
一个事务操作时,其他事务要等待。
一个事务修改数据,另一个事务不能修改,这两个事务要进行隔离。
事务并不是完全隔离的(效率低),数据库为了兼顾并发性和数据安全,一定程度上允许事务并发执行,并设置了隔离的级别。
D——Durancy
持久性,事务成功,数据被永久的保存
数据访问冲突的问题
多个事务同时执行,可能引发三种数据访问冲突问题:
1.脏数据
2.不可重复读
3.幻觉读
1.脏数据
一个事务未提交的数据(临时保存在内存文件中,表里还没保存,有可能在未来失效)(或者修改数据,没修改完),被另一个事务查询到
2.不可重复读
数据每次读取的结果一致叫可重复读。
针对数据修改的update操作
查询过的数据(数据被别的事务修改并提交了)再次查询时,与之前的查询结果不一致
3.幻觉读
针对数据的插入和删除操作:
新插入的数据,查询不到
删除的数据,能查询到(看到不该看的东西)
隔离级别
为了避免数据访问冲突问题,避免数据的混乱,数据库会让事务进行隔离(别让事务同时执行,保证数据安全)
为了兼顾数据安全和性能数据库提供了四种隔离级别
级别越高越安全,性能越差
级别越低越不安全,性能越高
mysql设置隔离级别
set tx_isolation='read-uncommitted';
1.未提交可读-脏读,不可重复读,幻觉读
set tx_isolation='read-committed';
2.提交可读-不可重复读,幻觉读
set tx_isolation='repeatable-read'; --默认级别
3.可重复读-幻觉读(默认级别,最佳选择)
set tx_isolation='serialiable';
4.串行化-排列执行(级别最高)
这样导致了脏读
这样导致了不可重复读
这样导致了幻觉读,新插入的数据看不到
这样导致了幻觉读,假更新了删除的数据,commit后才发现数据早就被删除了