mysql事务

2019-10-20  本文已影响0人  dancer4code

MySQL 事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)一致性(Consistency)隔离性(Isolation,又称独立性)持久性(Durability)

在 mysql 命令行的默认设置下,事务都是自动提交的,即执行 sql 语句后就会马上执行 commit 操作。因此要显式地开启一个事务务须使用命令 begin 或 start transaction,或者执行命令 set autocommit=0,用来禁止使用当前会话的自动提交。

事务控制语句:

savepoint 是在数据库事务处理中实现“子事务”(subtransaction),也称为嵌套事务的方法。事务可以回滚到 savepoint 而不影响 savepoint 创建前的变化, 不需要放弃整个事务。
rollback 回滚的用法可以设置保留点 savepoint,执行多条操作时,回滚到想要的那条语句之前。

使用 savepoint
savepoint savepoint_name; // 声明一个 savepoint
rollback to savepoint_name; // 回滚到savepoint

删除 savepoint
保留点再事务处理完成(执行一条 rollback 或 commit)后自动释放。
mysql5 以来,可以用:
release savepoint savepoint_name; // 删除指定保留点

MYSQL 事务处理主要有两种方法:

  1. 用 begin, rollback, commit来实现
    begin 开始一个事务
    rollback 事务回滚
    commit 事务确认
  2. 直接用 set 来改变 mysql 的自动提交模式:
    set autocommit=0 禁止自动提交
    set autocommit=1 开启自动提交

脏读、不可重复读、幻读、第一类丢失更新、第二类丢失更新

解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题

不可重复读的重点是修改 :
同样的条件, 你读取过的数据,再次读取出来发现值不一样了
幻读的重点在于新增或者删除
同样的条件, 第 1 次和第 2 次读出来的记录数不一样

在一个程序中,依据事务的隔离级别将会有三种情况发生。

数据库提供了四种隔离级别
因此数据库提供了四种隔离级别来解决上面的问题, 不同的隔离级别采用不同的锁类开来实现.

事务的隔离级别越高,隔离性越强,所拥有的问题越少,并发能力越弱,所以,我们可以用如下表格进行总结

隔离级别 脏读 不可重复读 幻读
Read uncommitted (未提交读)
Read committed (已提交读) ×
Repeatable read(可重复读) × ×
Serializable(可串行化) × × ×

参考
MySQL 事务
MySQL事务
脏读、幻读和不可重复读 + 事务隔离级别
mysql/mariadb知识点总结(20):事务控制语句 (事务总结之二)

上一篇 下一篇

猜你喜欢

热点阅读