一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务。是一种机制,是iyge操作序列,保证序列操作要么都做,要么都不做。
事务控制语句:
begin:开始一个事务(与start transaction等价)
rollback:事务回滚(rollback work 等价)
commt:提交事务(commit work等价)
set transaction:设置事务隔离级别(SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
set 改变事务是否自动提交:set autocommit=0禁止自动提交;=1开启自动提交。
事务特性:ACID:原子性、一直性、隔离性、持久性
事务的实现:redo log:持久性和一致性;undo_log:一直性和MVCC
redo:记录修改后的状态,commit基于redo实现,无论是否开启事务,都会立刻执行,只是开启事务后将执行结果保存在redo中,commit之后才写入磁盘。
undo:记录修改前的状态,rollback基于undo实现
ps:
spring开启事务和mysql开启事务不一致时会怎样?
以spring事务为主
redis事务和mysql事务的区别?
1.事务指令
Mysql:begin、commit、rollback
Redis:multi(标记事务开始)、exec(执行commands队列)、discard(结束事务,并消除commands队列)
2.事务底层实现
Mysql基于undo日志和redo日志
undo日志实现了rollback操作
redo日志实现了commit操作
Redis基于Commands队列实现
3.事务默认状态
Mysql默认开启
无论是否开启事务,都会马上执行命令,只是开启事务后将状态存入redo日志,commit后才写入磁盘
Redis默认关闭
没开启事务:立即执行并返回结果,直接写入内存
开启事务:不会立刻执行,排入队列,并返回队列状态,调用exec才会执行commands中的命令
4.事务是否支持回滚
Mysql支持回滚 Redis不支持回滚,
可以使用WATCH去监听key在事务发生之前是否被修改,若被修改则回滚5.事务是否原子性
mysql事务是原子性的,关系型数据库中的事务都是原子性的
redis命令是原子性的,事务不是原子性的
1.若事务队列中存在命令错误(类似java编译性错误),执行exec,所有命令都不会执行
2.若事务中存在语法错误(类似java 1/0的运行时异常),执行 exec,正确命令会被执行,错误命令抛出异常



