26
2017
09

Photon_使用NHibernate中事物防止脏数据_007

对于有些操作我们必须使用一次性操作完成,假如我们在操作某个操作的时候,执行了一般的SQL操作,由于其他原因,终止了SQL操作,还有一部分操作没有完成,那么,会造成数据的不完整性。如果继续之前没有完成的操作,那么就相对比较麻烦。所以使用事务会相对比较轻松。


什么是事务呢?

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。


特性

事务是恢复和并发控制的基本单位。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。


我们先不使用事务向数据库中添加数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NHibernate;
using NHibernate.Cfg;
using YYEdu.Model;
namespace YYEdu
{
    class Program
    {
        static void Main(string[] args)
        {
            var configueration = new Configuration();
            //解析hibernate.cfg.xml文件
            configueration.Configure();
            //解析映射文件
            configueration.AddAssembly("YYEdu");
            ISessionFactory sessionFactory = null;
            ISession session = null;
            ITransaction transaction = null;
            try
            {
                sessionFactory = configueration.BuildSessionFactory();
                session = sessionFactory.OpenSession();
                //数据库中"yy763496668" 不存在 杨勇博客已经存在
                User user1 = new User() { Username = "yy763496668", Password = "123456" };
                User user2 = new User() { Username = "杨勇博客", Password = "123456" };

                session.Save(user1);
                session.Save(user2);
            }
            catch (Exception e)
            {

                Console.WriteLine(e);
            }
            finally
            {
                if (transaction != null)
                {
                    transaction.Dispose();
                }
                if (session!= null)
                {
                    session.Close();
                }
                if (sessionFactory != null)
                {
                    sessionFactory.Close();
                }
            }

        }
    }
}

我们会发现数据库中添加了第一条数据但是没有添加第二条数据,因为第二条数据在的username,是唯一的所以添加不进去。
这里写图片描述

这里写图片描述
加入我们要求如果能够全部添加那么就全部添加进去,如果有一条添加不进去,那么所有的都不能添加进去。
这时候就需要使用事务

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NHibernate;
using NHibernate.Cfg;
using YYEdu.Model;
namespace YYEdu
{
    class Program
    {
        static void Main(string[] args)
        {
            var configueration = new Configuration();
            //解析hibernate.cfg.xml文件
            configueration.Configure();
            //解析映射文件
            configueration.AddAssembly("YYEdu");
            ISessionFactory sessionFactory = null;
            ISession session = null;
            ITransaction transaction = null;
            try
            {
                sessionFactory = configueration.BuildSessionFactory();
                session = sessionFactory.OpenSession();
                //事务
                transaction = session.BeginTransaction();
                //数据库中"yy763496668" 不存在 杨勇博客已经存在
                User user1 = new User() { Username = "杨勇博客之家yy", Password = "123456" };
                User user2 = new User() { Username = "yy763496668", Password = "123456" };

                session.Save(user1);
                session.Save(user2);
                transaction.Commit();

            }
            catch (Exception e)
            {

                Console.WriteLine(e);
            }
            finally
            {
                if (transaction != null)
                {
                    transaction.Dispose();
                }
                if (session!= null)
                {
                    session.Close();
                }
                if (sessionFactory != null)
                {
                    sessionFactory.Close();
                }
            }

        }
    }
}

这里写图片描述
我们发现两条数据都没有添加进去
这里写图片描述
当两条数据全都可以添加进去的时候

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NHibernate;
using NHibernate.Cfg;
using YYEdu.Model;
namespace YYEdu
{
    class Program
    {
        static void Main(string[] args)
        {
            var configueration = new Configuration();
            //解析hibernate.cfg.xml文件
            configueration.Configure();
            //解析映射文件
            configueration.AddAssembly("YYEdu");
            ISessionFactory sessionFactory = null;
            ISession session = null;
            ITransaction transaction = null;
            try
            {
                sessionFactory = configueration.BuildSessionFactory();
                session = sessionFactory.OpenSession();

                //插入操作
                //User user = new User() { Username = "yy01", Password = "123456" };
                //session.Save(user);
                //session.Flush();

                //修改操作
                //User obj = session.Get<User>(16);
                //obj.Password = "123456";
                //session.Update(obj);
                //session.Flush();

                //删除操作
                //User obj1 = session.Get<User>(16);
                //session.Delete(obj1);
                //session.Flush();

                //查询
                //ISQLQuery query = session.CreateSQLQuery("select * from users").AddEntity(typeof(User));
                //IList<User> u = query.List<User>();
                //Console.WriteLine(u[0].Username);
                //Console.WriteLine();

                transaction = session.BeginTransaction();
                //数据库中"yy763496668" 不存在 杨勇博客已经存在
                User user1 = new User() { Username = "杨勇博客之家yy", Password = "123456" };
                User user2 = new User() { Username = "杨勇博客之家yy763496668", Password = "123456" };

                session.Save(user1);
                session.Save(user2);
                transaction.Commit();

            }
            catch (Exception e)
            {

                Console.WriteLine(e);
            }
            finally
            {
                if (transaction != null)
                {
                    transaction.Dispose();
                }
                if (session!= null)
                {
                    session.Close();
                }
                if (sessionFactory != null)
                {
                    sessionFactory.Close();
                }
            }

        }
    }
}

这里写图片描述
两条数据添加成功
这里写图片描述

上一篇:Photon_使用ExecuteReader读取数据库中的数据_003 下一篇:工厂设计模式 - 数据存储的特有方式