none
Control de concurrencia RRS feed

  • Pregunta

  • Hola, tengo una base de datos a la cual van a acceder varios usuarios y quisiera saber cual es la mejor forma de controlar la concurrencia. Estoy programando en c# y SQL SERVER 2008 EXPRESS. Muchas Gracias.
    lunes, 10 de agosto de 2009 4:02

Respuestas

Todas las respuestas

  • Hola te recomiendo que leas este articulo de dotnetmania

    http://www.dotnetmania.com/Articulos/003/Apoyo/dnm3pg20-26.pdf

    Un articulo en ingles

    http://aspalliance.com/1489_Advanced_Concepts_in_SQL_Server_2005.6

    y si te atreves con el ingles aqui tienes unos screencast que lo explican al detalle

    http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?culture=en-US&EventID=1032282057&CountryCode=US

    http://ntcompatible.com/TechNet_Webcast_Managing_Concurrency_in_SQL_Server_2005_Part_2_of_2_Planning_for_and_Troubleshooting_Snapshot_Isolation_and_Row_Level_Versioning_Level_200_s57408.html
    Oscar Avarez Guerras - Arquitecto Software en I3B (I+D+I) Blog:http://geeks.ms/blogs/oalvarez Por favor marca como respuesta si te ha ayudado esta respuesta
    lunes, 10 de agosto de 2009 5:31
  • hola,

    la forma mas eficiente que he podido utilziar es hacer uso de TimeStamp en Sql Server (ni impoerta la version) para poder determinar si alguien modifico el registro.

    Concurrent User Updates in ASP.NET and SQL Server


    Cómo utilizar la columna de marca de hora de una tabla de control de concurrencia optimista en SQL Server 2005


    este ultimo link ahce uso de controles de conexion a la db, no se si tu los estas utilizando pero si esi es por ahi te sea de ayuda

    Implementing Optimistic Concurrency with SQL Timestamps


    Resumen, basicamente al moemto de actualizar compara la fecha que tienes con la que se encuantra en la db, si son iguales procede, sino envia un error indicando que alguine previamente modifico el registro.

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 10 de agosto de 2009 13:45
  • depende lo que estes haciedo y a lo que te estes refiriendo con concurrencia.

    en terminos practicos sql server ya maneja la concurrencia por ti.



    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Mi Blog C# XNA Sistemas Operativos
    miércoles, 12 de agosto de 2009 4:23
    Moderador
  •  Hola Muchachos,

    Para el caso de Mysql como prodria controlar la concurrencia?

    He visto cierto citios y solo en uno pude ver que el control de concurrencia lo hacen con el entityFramework con un asistente.

    Para el caso de mysql ya se como hacerlo en el 'Command Line' (Utilidad que trae el servidor de Mysql). Por ejemplo:

    //editor de comandos del Command Line

    mysql>begin; // inicio una transaccion

    //si yo ejecuto este comando select y otro usuario de la bd e inclusive el mismo usuario, intenta modificarlo, no lo puede hacer.

    mysql>select idproduc,nomproduc from tbl_producto where prodid=3 for update;

    //para que otro usuario o el mismo usuario pueda modificar ese registro, hay que hacer un commit;

    mysql>commit; //en el caso de una aplicacion, este commit, lo debería hacer el usuario que consulto el registro, para que otro usuario luego lo pueda modifcar

    Mi pregunta es, como lo hago en C# con la dll de MysqlConnector.Net ??

    He intentado con BeginTransaction y no me funcion, aqui dejo mi codigo:

                MySqlConnection mConexionMysql =new mConexionMysql();

                MySqlTransaction myTrans;

                DataSet ds = new DataSet();
                MySqlDataAdapter myda = new MySqlDataAdapter();


                if (mConexionMysql.State == System.Data.ConnectionState.Closed)
                    mConexionMysql.Open();

                MySqlCommand myCommand = mConexionMysql.CreateCommand();
                myCommand.Connection = mConexionMysql;
                myCommand.Transaction = myTrans;

                try
                {
                    myCommand.CommandText = "select idproduc,nomproduc from tbl_producto where idproduc=" + IdProducto + " for update";

                    myCommand.ExecuteNonQuery();
                    myda.SelectCommand = myCommand;
                    myda.Fill(ds);

                    if (ds != null)
                        this.grid1.DataSource = ds.Tables[0]; //lo paso a un datagridview

                }//try
                catch (Exception e)
                {
                    try
                    {
                        myTrans.Rollback();
                    }
                    catch (MySqlException ex)
                    {
                        if (myTrans.Connection != null)
                        {
                            MessageBox.Show("An exception of type " + ex.GetType() +
                                              " was encountered while attempting to roll back the transaction.");
                        }
                    }

                    MessageBox.Show("An exception of type " + e.GetType() +
                                      " was encountered while inserting the data.");

                }
                finally
                {
                    mConexionMysql.Close();
                }

    Les agradezco su colaboracion ya que no he podido avanzar en el proyecto por este problema.

    Muchas gracias!


    R@lfs...

    jueves, 11 de octubre de 2012 22:56