MySQL-04事务-使用事务

本机事务(transaction)

start transaction; // 开始一个事务

# 开始事务后, 表是没有锁的, 因为start transaction会隐式的unlock表
SQL语句...

savepoint xxx;
SQL语句...

rollback to savepoint xxx;

// 在commit 之前, 其他线程可以查询表, 但看不到上面的结果
commit;

// 在commit 之后, 其他线程才可以看到改变

分布式事务(xa)

xa start 'test', 'db1';  -- 启动xid='text', 分支='db1'的分布式事务
SQL 语句...
xa end 'test', 'db1';
xa prepare 'test', 'db1'; -- 分支db1进入prepare状态
-- 必须xid='test'的所有分支都commit, 事务才算完成
xa commit 'text', 'db1';
DB1 DB2
xa start ‘transxxx’ ‘db1’ xa start ‘transxxx’ ‘db2’ 开始事务
insert db1 .. update db2 …
xa end ‘transxxx’ ‘db1’ xa end ‘transxxx’ ‘db2’
xa prepare ‘transxxx’ ‘db1’ xa prepare ‘transxxx’ ‘db2’ 进入Prepare阶段
xa commit ‘transxxx’ ‘db1’ xa commit ‘transxxx’ ‘db2’ 提交事务

命令说明:

  • 开始事务: xa start xid, xid是某个分布式事务的唯一id, xid分三部分: 分布式事务标识+事务分支标识+formatid
    • 上面的例子只有 “分布式事务标识+事务分支标识”, 后者用db1/db2表示在不同库上的事务分支
  • xa prepare:
  • xa commit:

实现

@todo: MySQL分布式事务XA似乎用的是2PC ? 事务管理器组件 atomikos 的实现? @todo

@ref MySQL分布式事务(XA事务)-云栖社区-阿里云