事务的四大性质和隔离级别
什么是事务:一系列严密的操作,要么全部成功,要么全部失败。mysql只有Innodb引擎才支持事务,事务最终目的是要保障数据的可靠性、一致性
-
四大性质(ACID)
- 原子性(Atomicity):要么全成功,要么全失败回滚
- 一致性(Consistency):一个事务执行前后处于一致性状态,银行的数据库,总金额一共就那么多,不管谁转给谁,你多了他就少了,不能说操作完总金额还多了或少了。
- 隔离性(Isolation):多个事务并发操作时要相互隔离,不能互相干扰,即每个事务都要感觉自己在使用期间是数据库里唯一一个正在操作的事务,要么自己操作完别人才开始,要么别人操作完自己才开始。
- 持久性(Durability):在事务中,自己一旦提交,对数据库的修改就是永久性的了,即使是数据库故障也不会自己提交的内容。
-
不考虑事务隔离性可能出现的问题
- 脏读:一个事务在读取了另一个未提交的事务中的数据。若其他事务回滚了,自己读的其实是不正确(脏)的数据。
- 不可重复读:一个事务读了别人已提交的数据,每次读到的都不一样。
- 幻(虚)读:针对批量数据。其中一个事务批量修改了某列,另一个事务同时插入了一行数据,修改的那个事务再次读就发现有一条数据还没修改,就好像出现了幻觉。
-
隔离级别
- read uncommited:无法保证避免任何一种情况。
- read commited:可避免脏读。
- repeatable read:可避免脏读、不可重复读,mysql默认隔离级别。
- serializable:可避免脏读、不可重复读、幻读。但效率低下,类似单线程。
# 查看隔离级别 select @@tx_isolation; # 设置隔离级别 set [global|session] transaction isolation level xxx; set tx_isolation='xxx'; # jdbc: conn.setAutoCommit(false)之前设置setTransactionIsolation(Connection.TRANSACTION_xxx) # 隔离级别只对当前连接有效,mysql命令行窗口是一个连接,jdbc一个connection是一个连接 # 授予通过网络方式登录的tom用户,对所有库所有表的全部权限,密码设为abc123. grant all privileges on *.* to tom@'%' identified by 'abc123'; # 给tom用户使用本地命令行方式,授予userdb这个库下的所有表的插删改查的权限。 grant select,insert,delete,update on userdb.* to tom@localhost identified by 'abc123';