隔离级别 脏读(dirty read) 不可重复读(nonrepeatable read) 幻读(phantom read)
========================================================================
未提交读(read uncommitted) 可能 可能 可能
已提交读(read committed) 不可能 可能 可能
可重复读(repeatable read) 不可能 不可能 可能
可串行化(serializable ) 不可能 不可能 不可能
串行化事务最简单策略就是修改事务级别为可串行化,这样某一事务执行时会禁止其他事务执行。但这种方法实际上不可行,因为它使程序对数据库的操作变成单线程的了,不能充分共享数据库资源。悲观锁控制当用户执行的操作时会在数据上加锁,直到当前事务释放锁时,其他事务才能执行与该锁相冲突的操作。以mysql的事务为例:set autocommit=0;begin;select status from t_goods where id=1 for update...commit;默认为行锁,超过一定行数升级为表锁。执行select... for update后,则其他select...for update对此数据的查询会阻塞,但普通select此表不会受影响。乐观锁控制用时间戳或版本号控制。用户读数据时不锁定,但查询数据时也一起将控制字段查出。当用户更新时先检查此时数据库中控制字段的值与程序中之前拿到的值是否相同。不同则此条数据已被处理,相同则更新数据,并同时更新控制字段的值为当前时间戳或版本号加1。7)小事务:避免长时间锁定数据,可以将大数据量的更新或删除分成批次,一个批次是一个小事务。通过记录已成功批次的序号方便意外终止后的恢复。8)数据删除:删除时可先逻辑删除,更新一个标记列的值表示数据已无效,达到记录留存的作用。日后真正无用时可做物理删除。9)扩展性:核心表预留出int,long,char等各种类型的扩展字段。10)分区分库:日均数据增长量大的表,可以按进行分区甚至复合分区。过期数据进行删除或归档到历史库。归档方法可采用:定期请求dba手动、应用程序(如java)中实现、服务器上部署shell脚本实现等。
