# 数据库事务

重要

来自马哥Linux

# 事务

一组原子性的sql查询,或者说一个独立的工作单元。

ACID:

  • A: atomicity, 原子性:整个事务中的所有操作要么全部成功执行,要么全部失败后回滚。

如何回滚?通过撤销日志,可以实现回滚操作。还有重做日志,可以把以前的操作重新运行一次。

  • C: consistency,一致性:数据库总是从一个一致性状态转换为另一个一致性操作。
  • I: Isolation,隔离性:一个事物所做出的操作在提交之前,是不能为其他所见。(隔离级别就在保证隔离性)隔离有多种隔离级别。 隔离级别越低,并发性越高,数据安全性越低。事务的隔离会极大的带来系统的开销。
  • D: durability: 持久性:一旦事务提交,其所做的修改会永久保存于数据库中。

事务日志:

  • redolog
  • undolog

使用事务:

  1. 启动事务: start transaction
  2. 运行sql语句
  3. 结束事务:
    • commit : 提交
    • rollback : 回滚 注意: 只有事务性存储引擎方能支持此类操作。
sql> SHOW GLOBAL VARIABLES LIKE '%auto%';

+----------------------------------------------+-------+
| Variable_name                                | Value |
+----------------------------------------------+-------+
| auto_generate_certs                          | ON    |
| auto_increment_increment                     | 1     |
| auto_increment_offset                        | 1     |
| autocommit                                   | ON    |
| automatic_sp_privileges                      | ON    |
| caching_sha2_password_auto_generate_rsa_keys | ON    |
| innodb_autoextend_increment                  | 64    |
| innodb_autoinc_lock_mode                     | 2     |
| innodb_stats_auto_recalc                     | ON    |
| sha256_password_auto_generate_rsa_keys       | ON    |
| sql_auto_is_null                             | OFF   |
+----------------------------------------------+-------+
11 rows in set (0.24 sec)

全局参数:autocommit 自动提交。也就是每一条语句都会自动提交事务。 自动提交会相当影响性能的。

建议: 显式请求和提交事务,而不要使用“自动提交”功能。因为每个提交都会引起磁盘IO操作。 这样会使数据库服务器频繁的进行io操作。降低系统性能。

会话级别关闭自动提交:

SET SESSION autocommit = 0; 

事务支持:savepoint[事务保存点]

语法:

savepoint identifier
rollback [work] to [savepoint] identifier
release savepoint identifier  

事务隔离级别:

锁有粒度,粒度越精细,并发性越好,但是带来的额外开销越大。同样的,事务需要隔离,但是隔离做的如果过于严格,任何一个事务都有可能会阻塞其他访问到同一个资源的事物。所以为了避免事务过多的影响其并发性,所以对事务隔离的等级做了定义,这也就是隔离级别。

  • READ UNCOMMITED(读未提交)
  • READ COMMITED(读已提交)
  • REPEATABLE READ(可重复读)
  • SERIALIZABLE(串行化) 并发能力最低,安全性最高

隔离级别越低,随之产生的问题越大。

可能存在的问题:

  • 脏读: 读取到别人未提交的数据。
  • 不可重复读: 两次读取到的数据是不一样的。
  • 幻读: 对方已提交
  • 加锁读: 加了锁,别人都读取不到了。
show global variables like '%isola%';

+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.01 sec)

默认为 可重复读 级别,可在session级别进行修改。

set transaction_isolation = 'READ-UNCOMMITED';

死锁: 两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态。

MVCC(InnoDB引擎): 多版本并发控制。

事务日志: 随机IO和离散IO操作会引起很大的性能开销。 事务日志的写入类型为“追加”,因此其操作为“顺序IO”,此日志通常被称为“预写式日志(write ahead logging)”。

不要使用混合的存储引擎,因为有些支持事务,有些不支持事务。

https://zhuanlan.zhihu.com/p/76743929

https://mp.weixin.qq.com/s/F1nmUKHZUNp2aWnUtNQ0lw (opens new window)

关于评论

评论前请填好“昵称”、“邮箱”这两栏内容,否则不会收到回复,谢谢!