事务概念
事务是一个操作集合,这些操作要么都执行,要么都不执行。
典型的例子:从银行的帐户A转帐到帐户B,需要:1.从帐户A取出款项 2.把款项放入帐户B中。这两个过程要么同时成功,要么同时失败。
这一系列的操作就是事务性(Transactional)操作。
事务特性
又叫:ACID特性。
-
原子性:当事务结束,它对所有资源状态的改变都被视为一个操作,这些操作要不同时成功,要不同时失败。理解:主要依靠undo.log日志实现,即在事务失败时执行回滚。undo.log日志会记录事务执行的sql,当事务需要回滚时,通过反向补偿回滚数据库状态。
-
一致性:操作完成后,所有数据必须符合业务规则,否则事务必须中止。理解:事务在执行的前和后数据库的状态都是正常的,表现为没有违反数据完整性,参照完整性和用户自定义完整性等等。
-
隔离性:事务以相互隔离的方式执行,事务以外的实体无法知道事务过程中的中间状态。理解:多线程时多事务之间互相产生了影响,要避免这个影响,那就加锁。mysql的锁有表锁,行锁,间隙锁,好像还有一个锁数据库的,叫全局锁还是什么来着。写写操作通过加锁实现隔离性,亵渎操作通过MVCC实现。
-
持久性:事务提交后,数据必须以一种持久性方式存储起来。理解:主要依靠redo.log日志实现。首先,mysql持久化通过缓存来提高效率,即在select时先查缓存,再查磁盘;在update时先更新缓冲,再更新磁盘。以减少磁盘io次数,提高效率。但由于缓存断电就没了,所以需要redo.log日志。在执行修改操作时,sql会先写入到redo.log日志,再写入缓存中。这样即使断电,也能保证数据不丢失,达到持久性。
使用代码
使用事务管理在数据层使用得特别广泛。数据层的事务都是继承自DBTransaction,派生自IDbTransaction。
IDbConnection Connection {get;} // 返回Connection对象
void Commit(); // 数据提交,把所有改变数据保存到持久化数据库
void Rollback(); // 数据回滚,把所有数据恢复原值
// 数据回滚就是没有执行完成遇到错误,返回到之前的正确的状态
transaction = connection.BeginTransaction("SampleTransaction"); //启动事务
//设定SqlCommand的事务和连接对象
command.Connection = connection;
command.Transaction = transaction;
transaction.Commit(); // 完成提交
transaction.Rollback(); // 数据回滚
context.SubmitChanges(); // 更新数据
context.Transaction.Commit(); // 事务提交
context.Transaction.Rollback(); // 数据回滚
……学到后面再写
参考
https://www.cnblogs.com/leslies2/archive/2012/01/05/2289106.html#t1