# 数据库事务
重要
来自马哥Linux
# 事务
一组原子性的sql查询,或者说一个独立的工作单元。
ACID:
- A: atomicity, 原子性:整个事务中的所有操作要么全部成功执行,要么全部失败后回滚。
如何回滚?通过撤销日志,可以实现回滚操作。还有重做日志,可以把以前的操作重新运行一次。
- C: consistency,一致性:数据库总是从一个一致性状态转换为另一个一致性操作。
- I: Isolation,隔离性:一个事物所做出的操作在提交之前,是不能为其他所见。(隔离级别就在保证隔离性)隔离有多种隔离级别。 隔离级别越低,并发性越高,数据安全性越低。事务的隔离会极大的带来系统的开销。
- D: durability: 持久性:一旦事务提交,其所做的修改会永久保存于数据库中。
事务日志:
- redolog
- undolog
使用事务:
- 启动事务: start transaction
- 运行sql语句
- 结束事务:
- 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)
关于评论
评论前请填好“昵称”、“邮箱”这两栏内容,否则不会收到回复,谢谢!