Appearance
数据库事务操作
MySQL中的事务主要用于处理容易出现错误的数据
事务可以用来维护维护数据的完整性,保证成批的SQL语句要么全部执行,要么全部不执行
事务用来管理 insert,update,delete语句
MySQL中只有使用了Innodb数据库引擎的表才支持事务
事务语法
开启事务:
start transaction提交事务:
commit回滚事务:
rollback
注意点:
事务的本质是开启事务的时候,拷贝一张一模一样的表,然后执行相关的操作都是在拷贝的这张表中操作。 如果失败了,如果执行了rollback,那么系统就会自动删除拷贝的这张表, 如果成功了且执行了commit,那么系统就会自动利用拷贝表中最新的数据覆盖原有表中的数据。 所以成功了会影响到原有的数据
事务回滚点
savepoint 回滚点名称
rollback to 回滚点名称
sql
start transcation;
insert into bank values(null,'1003','2222');
savepoint a;
insert into bank values(null,'1003','2222');
savepoint b;
insert into bank values(null,'1003','2222');
savepoint c;
insert into bank values(null,'1003','2222');
rollback to c; #混滚到c的位置c下面的数据就被删除
commit; #不提交数据不会更新
事务的特点
1.原子性(关注的是状态)
事务开启后所有的操作,要么全成功,要么全失败,不可能出现部分成功的情况, 事务执行过程中如果出错,哪怕我们不手动回滚,系统也会帮助我们回滚。
- 一致性(关注数据可见性)
事务开始前和结束后,数据库的完整性约束没有被破坏。
例如:A向B转账,不可能A扣钱了,B却没收到
- 持久性:
事务完成后,事务对数据的所有操作都是永久的,操作完成之后就不能再回滚
- 隔离性:
数据库允许多个并发事务同时对其数据进行读写和修改能力, 隔离性防止多个事务并发执行时由于交叉执行而导致数据的不一致。
事务隔离级别:
- 读未提交(read uncommitted) : 一个事务可以读取另一个未提交事务的数据
- 脏读 :能读取到其他事务没有提交的数据
- 解决办法:把事务的级别改为读提交
- 读提交 (read committed) : 一个事务要等另一个事务提交后才能读取数据
- 不可重复读:一个事务范围内多次查询结果不同
- 解决办法:把事务的级别改为可重复读
- 可重复读 (repeatable read) : 一个事务范围内多个相同的查询返回相同的结果
- 幻读:读取的结果不是最终的结果
- 解决办法:把事务级别改为串行化
- 串行化 (serializable) : 前面一个事务没有执行完成后面一个事务不能执行
不会出现 脏读、幻读、不可重复读的问题但是性能稍微差一点
- 查看隔离级别:
- 全局级别: select @@global.transaction_isolation;
- 当前会话的:select @@transaction_isolation;
- 设置隔离级别:
- 全局设置:set global transaction isolation level 级别名称;
- 当前会话:set session transaction isolation level 级别名称;