Skip to content

数据库事务操作

  • 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.原子性(关注的是状态)

事务开启后所有的操作,要么全成功,要么全失败,不可能出现部分成功的情况, 事务执行过程中如果出错,哪怕我们不手动回滚,系统也会帮助我们回滚。

  1. 一致性(关注数据可见性)

事务开始前和结束后,数据库的完整性约束没有被破坏。

例如:A向B转账,不可能A扣钱了,B却没收到

  1. 持久性:

事务完成后,事务对数据的所有操作都是永久的,操作完成之后就不能再回滚

  1. 隔离性:

数据库允许多个并发事务同时对其数据进行读写和修改能力, 隔离性防止多个事务并发执行时由于交叉执行而导致数据的不一致。

事务隔离级别:

  1. 读未提交(read uncommitted) : 一个事务可以读取另一个未提交事务的数据
  • 脏读 :能读取到其他事务没有提交的数据
  • 解决办法:把事务的级别改为读提交
  1. 读提交 (read committed) : 一个事务要等另一个事务提交后才能读取数据
  • 不可重复读:一个事务范围内多次查询结果不同
  • 解决办法:把事务的级别改为可重复读
  1. 可重复读 (repeatable read) : 一个事务范围内多个相同的查询返回相同的结果
  • 幻读:读取的结果不是最终的结果
  • 解决办法:把事务级别改为串行化
  1. 串行化 (serializable) : 前面一个事务没有执行完成后面一个事务不能执行

不会出现 脏读、幻读、不可重复读的问题但是性能稍微差一点

  • 查看隔离级别:
    • 全局级别: select @@global.transaction_isolation;
    • 当前会话的:select @@transaction_isolation;
  • 设置隔离级别:
    • 全局设置:set global transaction isolation level 级别名称;
    • 当前会话:set session transaction isolation level 级别名称;

Released under the MIT License.