MySQL学习笔记3【事务】
事务
多条mysql语句合并成一条事务,变成一个整体,要么全部执行成功,要么全部失败。
使用方式
方式一(推荐):
开启事务:
START TRANSACTION 或 BEGIN TRANSACTION;
提交事务:
COMMIT;
回滚事务:
ROLLBACK;
方式二:
查看事务提交方式
SELECT @@AUTOCOMMIT;
设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
SET @@AUTOCOMMIT = 0;
.......(此处注册相关语句到事务中)
提交事务
COMMIT;
回滚事务
ROLLBACK;
四大特性ACID
原子性(Atomicity):事务是不可分割的最小操作但愿,要么全部成功,要么全部失败
一致性(Consistency):事务完成时,必须使所有数据都保持一致状态
隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
并发事务问题
脏读
一个事务读到另一个事务还没提交的数据
不可重复读
一个事务先后读取同一条记录,但两次读取的数据不同
幻读
一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在,好像出现欢迎
事务隔离级别
Read uncommit
有
有
有
Read committed
无
有
有
Repeatable Read(默认)
无
无
有
Serializable
无
无
无
Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差
设置事务隔离级别:
这里最好去实践一下,可以帮助理解,以下是关于我的理解:
READ UNCOMMIT:两个事务完全并行,A事务会读取到B事务临时提交但并未COMMIT的数据。
READ COMMITTED:解决了脏读,A事务只会读取到已经COMMIT的数据。
REPEATABLE READ:解决了不可重复读,我理解为将开启事务时的数据作为数据源,从中查询,相当于快照,但是与此同时会出现幻读的情况,也就是在B事务已经COMMIT之后,A事务无法查询到B事务操作之后的数据,所以会导致信息不一致,比如说没有查询到id(主键)为3的数据,然后在这之后,B事务插入了id为3的数据,此时A事务再插入id为3的数据,就会出现错误,但是在A事务中,无论怎么查询,都不会查到id为3的数据。
SERIALIZABLE:让事务变成线性执行,相当于要排队来执行,与此同时,性能最差。
最后更新于