Mysql事务ACID基于日志
AC:回滚日志实现回滚(原子性)
D:重做日志实现持久化
I:加锁实现隔离级别 (MVVC无锁机制也可实现可重复读)
读未提交
存在问题:脏读(外部select事务内部)
解决方法:Update写锁(排它锁),select不加锁,提交事务才释放
不可重复读
存在问题:不可重复读(外部update事务内部)
解决方法:select读锁(共享锁),Update写锁(排它锁)提交事务才释放
可重复读
存在问题:幻读(外部insert事务内部)
解决方法:表锁?
串行化
Mysql事务命令
start transaction;
commit;
rollback;
JDBC的事务操作
con.setAutoCommit(false);
st = con.createStatement();
con.commit(); con.rollback();
Redis事务基于队列
不提供回滚机制
事务中的命令存在队列中,一次性执行,不被打断(串行化)
只有当队列中所有命令都依次执行完后才能得到每个结果的返回值
watch(乐观锁机制):事务开启前监视变量,若变量发生变化,则不开启事务
watch key
val = get key
val = 2 * val
multi
set key val
exec
实现线程安全的2倍乘。