什么是事务?
- 事务(Transaction)是指作为单个逻辑工作单元执行的一系列操作。这些操作要么全部成功执行,要么全部失败。
为什么需要事务?
- 保证数据的一致性和完整性。例如,就像银行转账,张三给李四转账,只有当张三的钱转走了,并且李四账户的钱收到了之后才会事务提交,否则事务会回滚到转账前的状态,保证数据的一致性,保证数据不会出错。
如何实现事务?
- MySQL的事务是怎么实现的?
- MySQL的事务实现是通过存储引擎层的
redo log
(重做日志)、undo log
(回滚日志)和锁系统来保证的。
- MySQL的事务实现是通过存储引擎层的
redo log(重做日志): 用于确保事务的持久性。redo log是物理日志,记录的是数据页的物理修改。当事务对数据进行修改时,InnoDB会先写入redo log,并更新内存,这样即使数据库崩溃,MySQL也可以通过redo log恢复数据。
undo log(回滚日志): 用于保证事务的原子性和一致性。undo log记录了数据的旧版本,可以用来回滚事务。
锁系统: 用于保证事务的隔离性。InnoDB锁是行级锁,对影响的数据加锁,保证事务在并发环境下的隔离性。事务开始时,会先写入redo log,然后在事务提交时,写入binlog(MySQL的二进制日志),确保事务的持久性和数据的复制一致性。
- Spring 的事务是怎么实现的?
@Transactional
项目只要整合了JDBC等数据源后,不需要导入额外的包。在接口、接口方法、类以及类方法上添加@Transactional
即可。
事务的特性?
原子性
(Atomicity)[ˌætəˈmɪsəti]:事务是一个不可分割的工作单位,必须作为一个整体执行。如果事务中的任何操作失败,整个事务会被回滚到开始前的状态,仿佛事务从未执行过一样。一致性
(Consistency)[kənˈsɪstənsi]:事务的执行应保持数据库的一致性状态。这意味着在事务开始之前和结束之后,数据库的完整性不应被破坏。所有写入的数据必须符合预设的规则,确保数据的准确性和一致性。隔离性
(Isolation):允许多个事务并发执行,同时保持数据的一致性。隔离性可以防止事务在并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同的级别,如读未提交、读提交、可重复读和串行化。持久性
(Durability)[ˌdjʊərəˈbɪlɪti]:一旦事务提交,对数据库的修改就是永久性的,即使系统发生故障也不会丢失。这保证了事务一旦完成,其效果是持久的。