MySQL/Transaction
< MySQL
Innodb开始支持事务。默认是自动提交,除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。
set autocommit=0 设置事务非自动提交。自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务。
通过以下命令可以查看当前autocommit模式
show variables like 'autocommit'; select @@autocommit;
注意事项:
- 不管autocommit 是1还是0 ,START TRANSACTION 后,只有执行了commit数据才会生效,ROLLBACK就会回滚。
- 当autocommit 为 0 时,不管有没有START TRANSACTION,只有执行了commit数据才会生效,ROLLBACK后就会回滚。关闭了数据库连接并不会自动提交。
- 当autocommit 为1是 ,且没有START TRANSACTION,则调用ROLLBACK是没有用的,即便设置了SAVEPOINT。
- 脏读:一个事务读取到了另一个事务未提交的数据,这是特别危险的,要尽力防止。
- 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(一个事务读取到了另一个事务已经提交的数据:增加记录、删除记录、修改记录),在某写情况下并不是问题,在另一些情况下就是问题。
- 虚读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一个事务读取到了另一个事务已经提交的数据---增加记录、删除记录),在某写情况下并不是问题,在另一些情况下就是问题。
四个隔离级别:
- Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
- Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
- Read committed:可避免脏读情况发生(读已提交)
- Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
- 安全性考虑:Serializable>Repeatable read>Read committed>Read uncommitted
- 数据库效率:Read uncommitted>Read committed>Repeatable read>Serializable
一般情况下,我们会使用Repeatable read、Read committed
mysql数据库默认的数据库隔离级别Repeatable read
mysql中设置数据库的隔离级别语句:
set [global/session] transaction isolation level xxxx;
mysql中设置数据库的隔离级别语句:
select @@tx_isolation;