阅读464 返回首页    go 阿里云


事务说明__用户指南_云数据库 PetaData-阿里云

begin语句

  1. begin语句用于开启单次事务;
  2. 对于连续begin,若用户通过第一个begin/start transaction/set autocommit = 0开启一个事务,稍后未进行提交而进行第二个begin/start transaction,那么分布式数据库将隐式地帮助用户commit上一个事务,这个commit的特性与普通commit相同,提交完成后,将自动进入下一个事务,这个工作流程与mysql一致;
  3. 一个单行事务,如果不在显式事务语句的保护下,若它是单分区的事务,那么该单行事务将具有与mysql相同的事务特性,若它是跨分区的事务,那么该单行事务将自动使用一阶段提交分布式事务,在部分分区提交成功部分分区提交失败时,可能导致回滚不一致;

commit语句

由于当前分布式数据库仅使用了一阶段提交事务,因此提交时,若一部分分区成功,而另一部分分区失败或异常关闭连接,那么将造成分区数据不一致,mysql的commit无论提交成功或失败,都将退出事务,commit成功,则所有更新将可见,commit失败,则所有更新将自动rollback;

rollback语句

无论分区回滚成功或失败,抑或分区异常关闭连接,分布式数据库保证始终向客户端返回ok结果;

基本set语句

  1. set autocommit = 0/1语句:set autocommit = 0语句用于设置连接长期开启事务,若用户不显示进行任何commit,则之前的更新均不会提交。对于autocommit由0转1,若用户通过set autocommit = 0开启一个事务,稍后未进行提交而通过set autocommit = 1提交一个事务,那么分布式数据库将隐式地帮助用户向所有分区发送一个set autocommit = 1,这条语句的特性与普通commit相同,由于mysql的commit会必然退出事务,此处的set autocommit = 1也将必然成功并返回ok结果,后续的操作将不再自动进入事务;
  2. set transaction isolation level {read uncommitted|read committed|repeatable read|serializable}语句:单分区事务的事务隔离级别兼容mysql的事务隔离级别,多分区事务的事务隔离级别总是为read_committed,set transaction isolation level XXXXXX与set tx_isolation = XXXXXX仅影响单分区事务的事务隔离级别;
  3. set transaction read only|write语句:该语句用于设置连接是否为只读或读写的;
  4. set names XXXXXX语句:该语句用来设置连接的字符集;
  5. 事务中,环境变量设置将向每一个参与事务的分区立即发送一条环境变量设置语句,除了set autocommit 0转1之外,其它的set动作若失败,则不会影响事务状态;
  6. 连接内新建立的后端分区连接,均会进行一轮全量环境变量设置,保证新连接具有最新的环境变量内容;
  7. 不支持具有历史依赖关系的环境变量,如set a = 1, set b = a + 1, set a = b + 1,所有环境变量的设置必须是自包含且幂等的单变量设置语句;

其他set语句

  1. 其它的环境变量均被解析器拦截,报告给用户一个warning消息,即设置环境的动作未执行;
  2. 非事务中,环境变量设置过程与begin语句开启的过程相同,均为延迟开启,即用户的环境变量语句或begin语句到达后,立即向用户报告ok结果,待用户真正的请求到达时,再根据请求涉及的后端分区,进行一轮独立的环境变量设置或begin的过程,完成后,再进行实际的请求投递,若这轮延迟的环境变量设置或begin失败,则向用户报错,用户下次请求到达时,仍然会进行一轮新的环境变量设置或begin的过程;
  3. 当前支持一些内建属性的设置,详情见“用户内建属性”一张;

分区异常关闭连接

若当前session处于事务中,而任意一个参与该事务的分区异常关闭了连接,则该session也将关闭与客户端的连接,并回滚事务;

分区不一致

当前仅支持单分区的完整事务,如果一个请求更新了多个分区,则没有分布式事务的保证,部分分区更新成功但部分分区更新失败,则可能出现数据不一致;

事务状态不一致:

  1. 事务中,遭遇单分区死锁,该分区将退出事务状态,其它分区可能仍然在事务状态,此时分区事务状态不一致,分布式数据库要求client仅能发送rollback,而不会为client自动进行其它分区的rollback调用;
  2. 事务开启时,begin/start transaction部分成功、部分失败,则成功的部分分区连接将被关闭(减少参与失败事务的分区数,减小事务失败的影响),同时向client返回error结果;
  3. 事务开启时,set autocommit = 0部分成功、部分失败,则失败的部分分区连接将被关闭(set autocommit = 0语句被延迟执行,此前已经向client保证了成功,此处仅能关闭执行失败的部分分区,成功的分区将进入事务),同时向client返回error结果;

环境变量不一致

  1. 多行事务中,立即发送的环境变量设置语句部分成功、部分失败,导致成功的分区使用新环境变量,失败的分区使用旧环境变量,此时将向用户返回环境变量不一致的错误,用户仍然有机会进行rollback;
  2. 单行事务中,延迟发送的环境变量设置语句部分成功、部分失败,导致成功的分区使用新环境变量,失败的分区使用旧环境变量,此时将向用户返回环境变量不一致的错误,用户请求并未实际执行;

已提交数据不一致

  1. 单行事务跨分区语句,部分成功、部分失败,此时将向client报出严重错误的异常,此时数据将不一致,并没有任何rollback的机会;
  2. 多行事务跨分区语句,commit或隐式commit部分成功、部分失败,此时将向client报出严重错误的异常,此时数据将不一致,并没有任何rollback的机会;

未提交数据不一致

多行事务跨分区语句,普通语句部分成功、部分失败,此时将报出数据不一致的异常,client仍然有rollback的机会;

死锁问题

  1. mysql在发现事务中的普通语句存在死锁后,将仅保留一个事务并允许其操作,同时清除其它死锁事务,退出事务状态;
  2. 若事务更新语句一次仅涉及一个分区,死锁的行存在于两个分区,那么死锁过程不会立即被检测出来,多个事务的死锁更新会请求锁,直到锁超时,然后由mysql通知更新error,这个error结果不会令分区退出事务状态,后续的操作与普通事务相同,分布式数据库将向用户返回锁超时错误;
  3. 若事务更新语句一次仅涉及一个分区,死锁的行存在于一个分区,那么死锁过程会立即被检测出来,多个事务的死锁更新,仅有一个被保留,其它事务将被立即回滚,由于事务更新历史中存在跨分区的可能,因此分布式数据库将强行锁定所有未通过mysql死锁检测且被清除的事务,强制用户只能进行rollback而不得进行其它任何操作,对于那个通过mysql死锁检测的事务,后续的操作与普通事务相同,分布式数据库将向用户返回死锁错误,后续非rollback语句将向用户返回仅支持rollback错误;
  4. 若事务更新语句一次涉及多个分区,死锁的行存在于两个分区,那么死锁过程不会立即被检测出来,多个事务的死锁更新会请求锁,直到锁超时,然后由mysql通知更新error,这个error结果不会令分区退出事务状态,后续的操作与普通事务相同,分布式数据库将向用户返回数据不一致错误;
  5. 若事务更新语句一次涉及多个分区,死锁的行存在于一个分区,那么死锁过程会立即被检测出来,多个事务的死锁更新,仅有一个被保留,其它事务将被立即回滚,由于事务更新历史中存在跨分区的可能,因此分布式数据库将强行锁定所有未通过mysql死锁检测且被清除的事务,强制用户只能进行rollback而不得进行其它任何操作,对于那个通过mysql死锁检测的事务,后续的操作与普通事务相同,分布式数据库将向用户返回数据不一致错误,后续非rollback语句将向用户返回仅支持rollback错误;

最后更新:2016-11-23 17:16:03

  上一篇:go DML语法__用户指南_云数据库 PetaData-阿里云
  下一篇:go 其他语句说明__用户指南_云数据库 PetaData-阿里云