本文共 2913 字,大约阅读时间需要 9 分钟。
update t_act set balance = balance - 10000 where actno = 'act-001';update t_act set balance = balance + 10000 where actno = 'act-002';
以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败。
要想保证以上的两条DML语句同时成功或者同时失败,那么就需要使用数据库的“事务机制”。为什么?因为它们这三个语句都是和数据库表当中的“数据”相关的。
事务的存在是为了保证数据的完整性,安全性。 假设所有的业务都能使用1条DML语句搞定,还需要事务机制吗? 不需要事务。 但实际情况不是这样的,通常一个“事儿(事务【业务】)”需要多条DML语句共同联合完成。事务包括四大特性:ACID
事务(Transaction:一批操作(一组DML
开启事务(Start Transaction) 回滚事务(rollback) 提交事务(commit) SET AUTOCOMMIT: 禁用或启用事务的自动提交模式 关于事务的回滚需要注意:只能回滚insert、delete和update语句,不能回滚select(回滚select没任何意义,对于create、drop、alter这些无法回滚.事务只对DML有效果。事务隔离性存在隔离级别,理论上隔离级别包括4个:
第一级别:读未提交(read uncommitted) 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的. 读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。 第二级别:读已提交(read committed) 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同 对方事务提交之后的数据我方可以读取到。 这种隔离级别解决了: 脏读现象没有了。 读已提交存在的问题是:不可重复读。 第三级别:可重复读(repeatable read) 确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。 这种隔离级别解决了:不可重复读问题。 这种隔离级别存在的问题是:读取到的数据是幻象。 第四级别:序列化读/串行化读(serializable) 解决了所有问题。 效率低。需要事务排队。 Oracle 支持的 2 种事务隔离级别: READ COMMITED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ COMMITED Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别 为: REPEATABLE READmysql事务默认情况下是自动提交的
自动提交模式用于决定新事务如何及何时启动。 启用自动提交模式:禁用自动提交模式:
自动提交模式可以通过服务器变量AUTOCOMMIT来控制。
例如:mysql> SET AUTOCOMMIT = OFF; mysql> SET AUTOCOMMIT = ON; 或mysql> SET SESSION AUTOCOMMIT = OFF; mysql> SET SESSION AUTOCOMMIT = ON;
show variables like ‘%auto%’; – 查看变量状态
每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每 个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别.
查看当前的隔离级别: SELECT @@tx_isolation; 设置当前 mySQL 连接的隔离级别:set transaction isolation level read committed; //会话级:只对当前的会话效
设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed;//全局级:对所的会话效
转载地址:http://sxuki.baihongyu.com/